【類反射】類的呼叫(呼叫類中的成員:成員變數、方法、構造方法)
★ 構造類物件
使用構造器新建物件。根據指定的引數型別找到相應的建構函式,傳入相應引數呼叫執行,以建立一個新的物件例項。
程式碼演示:
package cn.hncu.reflect.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
/**
*
* 利用類反射訪問(呼叫)構造器、方法、屬性
*
*@author <a" [email protected]">lxd</a>
*@version 1.0 2017-4-19 下午6:29:50
*@fileName ReflectOperateObj.java
*/
public class ReflectOperateObj {
/*
* 1、通過類反射呼叫構造器
*/
@Test
public void constructorDemo() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2" );
//1.1呼叫空參構造器
Object obj=c.newInstance();//建立此Class的物件所表示的類的一個例項
System.out.println("1:"+obj.toString());
//1.2呼叫指定(非空參)引數型別類表構造器
//類似於:UserModel2 user=new UserModel2("Jack",23);
//1.2.1要先獲取對應構造器物件con
Class[] parameterTypes=new Class[2];//★1:構造形引數列表★
parameterTypes[0 ]=String.class;//★2:引數列表中的第一個引數為String.class★
parameterTypes[1]=int.class;//★3:引數列表中的第二個引數為int.class★
//Class parameterTypes = null;可變引數是一個引數
Constructor con=c.getDeclaredConstructor(parameterTypes);//★4:得到構造器物件con★ 引數列表為:可變引數 Class... parameterTypes
//1.2.2 通過con物件進行構造新物件
Object[] initargs=new Object[2];//★6:構造實參列表★
initargs[0]=new String("Jack");
initargs[1]=new Integer(23);
Object obj2=con.newInstance(initargs);//★5:呼叫newInstance(Object... initargs)★
System.out.println("2:"+obj2);
}
★ 呼叫方法
根據方法名稱執行方法。根據方法名與引數型別匹配指定的方法,傳入相應引數與物件進行呼叫執行。若是靜態方法,則不需傳入具體物件。
程式碼演示:
/*
* 2、通過類反射呼叫普通方法
*/
@Test
public void methodDemo() throws Exception{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
//2.1呼叫空參方法,類似於user.toString();
//★1★先獲取指定方法所對應的Method物件
Method m=c.getDeclaredMethod("toString", null);//name - 方法名 :parameterTypes - 引數陣列
//★2★執行方法---呼叫該method的invoke方法,同時把user以實參形式傳入
Object user=c.newInstance();//也可以用demo1的非空參構造器new物件
//UserModel2 user=new UserModel2("Jack", 23);可以方便測試
Object str=m.invoke(user, null);//★3★得到的實際方法 <=>String str=user.toString();
System.out.println("1:"+str);
//2.2呼叫有引數方法 如:sum(int , double)---user.sum(100,12.13)
//呼叫方式和無參類似
//★2★構造形參
Class[] parameterTypes=new Class[2];
parameterTypes[0]=int.class;
parameterTypes[1]=double.class;
//★1★獲取物件
Method m2=c.getDeclaredMethod("sum", parameterTypes);
//★3★之行方法呼叫實參
Object resObj=m2.invoke(c.newInstance(), new Object[]{23,100.12} );//obj - 從中呼叫底層方法的物件 args - 用於方法呼叫的引數
System.out.println("2:"+resObj);
//2.3呼叫靜態方法
Method m3=c.getDeclaredMethod("abc", null);
m3.invoke(c.newInstance(), null);//void
}
★ 獲取與設定屬性值
根據屬性名稱讀取與修改屬性的值,訪問非靜態屬性需傳入物件為引數。
程式碼演示:
/*
* 3、通過類反射呼叫屬性(成員變數)
*/
@Test
public void fieldDemo() throws Exception{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
//3.1 訪問靜態變數
Field fld=c.getField("MAX");
fld.set(null, 222);//給靜態變數設定值
Object v1=fld.get(null);//讀取靜態變數中的值
System.out.println("1:"+v1);
//3.2 訪問非靜態變數---可以使用get(),也可以使用基本資料型別專用的get方法 如getDouble()
Field fld2=c.getField("value");
Object v2=fld2.get(c.newInstance());//這種get方法可以不需要知道其資料型別是什麼
System.out.println("v2:"+v2);
}
暴力訪問所有成員:
程式碼演示:
/*
* 4、暴力訪問
*/
@Test
public void violenceDemo() throws Exception{
Class c=Class.forName("cn.hncu.reflect.test.UserModel2");
Method m=c.getDeclaredMethod("psum", new Class[]{int.class,double.class,float.class});
m.setAccessible(true);//開啟暴力訪問門 該方法是AccessibleObject類中的,後者是Field、Method、Constructor的共同父類,因此都可以採用這一句開啟暴力訪問開關。
Object resStr=m.invoke(c.newInstance(), new Object[]{23,2.1,12f});
System.out.println(resStr);
}
}
相關推薦
【CodeForces - 144D】Missile Silos(單源最短路,列舉中間邊,列舉情況可能性)
題幹: A country called Berland consists of n cities, numbered with integer numbers from 1to n. Some of them are connected by bid
【HDU - 2376】Average distance (樹上任意兩點之間的距離之和的平均值、計算結點的貢獻度)
Given a tree, calculate the average distance between two vertices in the tree. For example, the average distance between two vertices in the followi
關於anaconda 找包,安裝包的一些總結(關於Anaconda中PackageNotFoundError: '' Package missing in current win-64 channe)
一、Anaconda作為一個工具包整合管理工具,下載python工具包是很方便的,直接敲: conda install package_name 但是有時候安裝一個工具包(如xmltodict)的時候,在當前的channels中找不到這個包,會提示: conda i
【類反射】類的呼叫(呼叫類中的成員:成員變數、方法、構造方法)
★ 構造類物件 使用構造器新建物件。根據指定的引數型別找到相應的建構函式,傳入相應引數呼叫執行,以建立一個新的物件例項。 程式碼演示: package cn.hncu.reflect.t
【java反射】Class類型的相關操作演練
div gif display 演練 esp arguments 接口 hid col 【一】獲取範型接口的實現類的範型類型 (1)範型接口 package org.springframework.context; import java.util.EventList
【CF960G】Bandit Blues(第一類斯特林數,FFT)
【CF960G】Bandit Blues(第一類斯特林數,FFT) 題面 洛谷 CF 求字首最大值有\(a\)個,字尾最大值有\(b\)個的長度為\(n\)的排列個數。 題解 完完全全就是【FJOI】建築師的加強版本。 顯然每一個字首最大值和一段連續的區間構成了一個環排列,顯然每個字首最大值就是這個環
【機器學習】神經網路(一)——多類分類問題
一、問題引入 早在監督學習中我們已經使用Logistic迴歸很好地解決二類分類問題。但現實生活中,更多的是多類分類問題(比如識別10個手寫數字)。本文引入神經網路模型解決多類分類問題。 二、神經網路模型介紹 神經網路模型是一個非常強大的模型,起源於嘗試讓機
【機器學習】人像識別(三)——K-Means聚類
簡介 K-Means聚類是一種非監督的聚類方式,原理參看資料探勘十大演算法 | k-means。 程式碼 import sys import random import numpy as np from sklearn.decomposit
【Unity教程】淺談Unity呼叫其他指令碼函式的方法(未完)
第一種,被呼叫指令碼函式為static型別,呼叫時直接用 指令碼名.函式名() 這種就是單例,簡單的單例的使用 如果程式碼過多,程式碼之間相互呼叫單例,每一次呼叫就會生成一個單例,如果程式碼過多, 就不方便程式碼的維護,造成程式效能的重要流失,因此不建議依賴使用單例 使用這種方法,必須在類的前面新增關鍵字
請賀老師幫我看看這個亂碼問題【任務2】分別定義Teacher(教師)類和Cadre(幹部)類,採用多重繼承方式由這兩個類派生出新類Teacher_Cadre
【任務2】(教材P394習題9)分別定義Teacher(教師)類和Cadre(幹部)類,採用多重繼承方式由這兩個類派生出新類Teacher_Cadre(教師兼幹部)。要求: (1)在兩個基類中都包含姓名、年齡、性別、地址、電話等資料成員。 (2)在Teacher類中還包
【個人筆記】《知了堂》MySQL中的數據類型
屬性 med mysql 表示 time align mes fault key MySQL中的數據類型 1、整型 MySQL數據類型 含義(有符號) tinyint(m) 1個字節 範圍(-128~127) smallint(m)
【Java基礎】Java基本數據類型與位運算
右移 數據 bits 類型 span 網上 height 使用 常數 1.賦值運算符 賦值使用操作符“=”。它的意思是“取右邊的值(即右值),把它復制給左邊(即左值)”。右值可以是任何 常數、變量或者表達式 (只要它能 生成
【資料庫筆記】編寫JDBC的工具類
註冊驅動和資料庫連線是固定操作,何不將這些固定操作封裝成一個類,並且提供靜態方法返回資料庫連線物件,達到程式碼的重複利用: /* * JDBC的工具類 * 用於註冊驅動,連線資料庫 */ import java.sql.Connection; import java.sql.Drive
【TP5.1】建立通用的基類自定義命令
author:咔咔 wechat:fangkangfk 在之前我們一直在做admin下的業務,在設定自定義模板的時候沒有考慮到一些情況 下面我們來改動一下 這樣做就ok了,不管是建立admin下的控制器,還是index的控制器,這一個模板就可以
【NOJ1006】【演算法實驗二】【回溯演算法】堡壘問題_方格類資料表示方法
1006.堡壘問題 時限:1000ms 記憶體限制:10000K 總時限:3000ms 描述 城堡是一個4×4的方格,為了保衛城堡,現需要在某些格子裡修建一些堡壘。城堡中的某些格子是牆,其餘格子都是空格,堡壘只能建在空格里,每個堡壘都可以向上下左右四個方向射擊,如
關於子類和父類之間的方法,構造方法呼叫關係
子類繼承了父類之後,父類的所有方法都可以被子類呼叫,父類的所有(除私有外)方法都可以被重寫; 但是父類中私有資料域不能在子類中被修改,只能通過呼叫父類的公共修改方法來修改; 例如下面圓幾何繼承了簡單幾何: 以上幾點說明: 簡單幾何類中的構造方法其實不需要寫,因
第十三週【任務二】Animal設計為抽象類,每一個Animal的派生類都有一個“名字”資料成員
【任務2】下面給出了基類Animal和main()函式。 (任務2.1)根據main()函式給出的註釋提示,設計出相關的各個類。 (任務2.2)顯然,Animal設計為抽象類更合適,Animal不需要能夠例項化,是專門作基類使用的。改造程式,使Animal設計為抽象類,這時
【程式語言】C++繼承和派生類、虛基類
從已有的物件型別出發建立一種新的物件型別,使它部分或全部繼承原物件的特點和功能,這是面向物件設計方法中的基本特性之一。繼承不僅簡化了程式設計方法,顯著提高了軟體的重用性,而且還使得軟體更加容易維護。派生則是繼承的直接產物,它通過繼承已有的一個或多個類來產生一個新的類,通過派生
【Spring學習】Spring JdbcTemplate之五類方法總結
自定義函式回撥:1、params:用於描述自定義函式佔位符引數或命名引數型別;SqlParameter用於描述IN型別引數、SqlOutParameter用於描述OUT型別引數、SqlInOutParameter用於描述INOUT型別引數、SqlReturnResultSet用於描述呼叫儲存過程或自定義函式返
【三層】無法直接啟動帶有“類庫輸出型別”的專案
發現問題 在學習三層過程中,遇到了一個這樣子的問題: 無法直接啟動帶有‘類庫輸出型別’的專案 分析問題 錯誤提示上寫的比較清楚了,專案的啟動項是一個類庫輸出專案,一個純粹的類庫專案是無法直接執行的。