欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基礎(chǔ)之反射

 更新時(shí)間:2023年03月29日 11:32:31   作者:敬業(yè)小碼哥  
JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象,都能夠調(diào)用它的任意一個(gè)方法和屬性;反射是框架設(shè)計(jì)的靈魂,感興趣的小伙伴可以參考閱讀

反射是框架設(shè)計(jì)的靈魂

(使用的前提條件:必須先得到代表的字節(jié)碼的Class,Class類用于表示.class文件(字節(jié)碼))

一、反射的概述

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對于任意一個(gè)對象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。
要想解剖一個(gè)類,必須先要獲取到該類的字節(jié)碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個(gè)字節(jié)碼文件對應(yīng)的Class類型的對象.

以上的總結(jié)就是什么是反射

反射就是把java類中的各種成分映射成一個(gè)個(gè)的Java對象
例如:一個(gè)類有:成員變量、方法、構(gòu)造方法、包等等信息,利用反射技術(shù)可以對一個(gè)類進(jìn)行解剖,把個(gè)個(gè)組成部分映射成一個(gè)個(gè)對象。
     (其實(shí):一個(gè)類中這些成員方法、構(gòu)造方法、在加入類中都有一個(gè)類來描述)
如圖是類的正常加載過程:反射的原理在與class對象。
熟悉一下加載的時(shí)候:Class對象的由來是將class文件讀入內(nèi)存,并為之創(chuàng)建一個(gè)Class對象。

其中這個(gè)Class對象很特殊。我們先了解一下這個(gè)C lass類

二、查看Class類在java中的api詳解(1.7的API)

如何閱讀java中的api詳見java基礎(chǔ)之——String字符串處理

Class 類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。也就是jvm中有N多的實(shí)例每個(gè)類都有該Class對象。(包括基本數(shù)據(jù)類型)
Class 沒有公共構(gòu)造方法。Class 對象是在加載類時(shí)由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的defineClass 方法自動構(gòu)造的。也就是這不需要我們自己去處理創(chuàng)建,JVM已經(jīng)幫我們創(chuàng)建好了。

沒有公共的構(gòu)造方法,方法共有64個(gè)太多了。下面用到哪個(gè)就詳解哪個(gè)吧

三、反射的使用(這里使用Student類做演示)

先寫一個(gè)Student類。

1、獲取Class對象的三種方式

1.1 Object ——> getClass();
1.2 任何數(shù)據(jù)類型(包括基本數(shù)據(jù)類型)都有一個(gè)“靜態(tài)”的class屬性
1.3 通過Class類的靜態(tài)方法:forName(String  className)(常用)

其中1.1是因?yàn)镺bject類中的getClass方法、因?yàn)樗蓄惗祭^承Object類。從而調(diào)用Object類來獲取

package fanshe;
/**
 * 獲取Class對象的三種方式
 * 1 Object ——> getClass();
 * 2 任何數(shù)據(jù)類型(包括基本數(shù)據(jù)類型)都有一個(gè)“靜態(tài)”的class屬性
 * 3 通過Class類的靜態(tài)方法:forName(String  className)(常用)
 *
 */
public class Fanshe {
	public static void main(String[] args) {
		//第一種方式獲取Class對象  
		Student stu1 = new Student();//這一new 產(chǎn)生一個(gè)Student對象,一個(gè)Class對象。
		Class stuClass = stu1.getClass();//獲取Class對象
		System.out.println(stuClass.getName());
		
		//第二種方式獲取Class對象
		Class stuClass2 = Student.class;
		System.out.println(stuClass == stuClass2);//判斷第一種方式獲取的Class對象和第二種方式獲取的是否是同一個(gè)
		
		//第三種方式獲取Class對象
		try {
			Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必須是真實(shí)路徑,就是帶包名的類路徑,包名.類名
			System.out.println(stuClass3 == stuClass2);//判斷三種方式是否獲取的是同一個(gè)Class對象
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
	}
}

注意:在運(yùn)行期間,一個(gè)類,只有一個(gè)Class對象產(chǎn)生。

三種方式常用第三種,第一種對象都有了還要反射干什么。第二種需要導(dǎo)入類的包,依賴太強(qiáng),不導(dǎo)包就拋編譯錯(cuò)誤。一般都第三種,一個(gè)字符串可以傳入也可寫在配置文件中等多種方法。

2、通過反射獲取構(gòu)造方法并使用:

student類:

package fanshe;
 
public class Student {
	
	//---------------構(gòu)造方法-------------------
	//(默認(rèn)的構(gòu)造方法)
	Student(String str){
		System.out.println("(默認(rèn))的構(gòu)造方法 s = " + str);
	}
	
	//無參構(gòu)造方法
	public Student(){
		System.out.println("調(diào)用了公有、無參構(gòu)造方法執(zhí)行了。。。");
	}
	
	//有一個(gè)參數(shù)的構(gòu)造方法
	public Student(char name){
		System.out.println("姓名:" + name);
	}
	
	//有多個(gè)參數(shù)的構(gòu)造方法
	public Student(String name ,int age){
		System.out.println("姓名:"+name+"年齡:"+ age);//這的執(zhí)行效率有問題,以后解決。
	}
	
	//受保護(hù)的構(gòu)造方法
	protected Student(boolean n){
		System.out.println("受保護(hù)的構(gòu)造方法 n = " + n);
	}
	
	//私有構(gòu)造方法
	private Student(int age){
		System.out.println("私有的構(gòu)造方法   年齡:"+ age);
	}
 
}

共有6個(gè)構(gòu)造方法;

測試類:

package fanshe;
 
import java.lang.reflect.Constructor;
 
 
/*
 * 通過Class對象可以獲取某個(gè)類中的:構(gòu)造方法、成員變量、成員方法;并訪問成員;
 * 
 * 1.獲取構(gòu)造方法:
 * 		1).批量的方法:
 * 			public Constructor[] getConstructors():所有"公有的"構(gòu)造方法
            public Constructor[] getDeclaredConstructors():獲取所有的構(gòu)造方法(包括私有、受保護(hù)、默認(rèn)、公有)
     
 * 		2).獲取單個(gè)的方法,并調(diào)用:
 * 			public Constructor getConstructor(Class... parameterTypes):獲取單個(gè)的"公有的"構(gòu)造方法:
 * 			public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個(gè)構(gòu)造方法"可以是私有的,或受保護(hù)、默認(rèn)、公有;
 * 		
 * 			調(diào)用構(gòu)造方法:
 * 			Constructor-->newInstance(Object... initargs)
 */
public class Constructors {
 
	public static void main(String[] args) throws Exception {
		//1.加載Class對象
		Class clazz = Class.forName("fanshe.Student");
		
		
		//2.獲取所有公有構(gòu)造方法
		System.out.println("**********************所有公有構(gòu)造方法*********************************");
		Constructor[] conArray = clazz.getConstructors();
		for(Constructor c : conArray){
			System.out.println(c);
		}
		
		
		System.out.println("************所有的構(gòu)造方法(包括:私有、受保護(hù)、默認(rèn)、公有)***************");
		conArray = clazz.getDeclaredConstructors();
		for(Constructor c : conArray){
			System.out.println(c);
		}
		
		System.out.println("*****************獲取公有、無參的構(gòu)造方法*******************************");
		Constructor con = clazz.getConstructor(null);
		//1>、因?yàn)槭菬o參的構(gòu)造方法所以類型是一個(gè)null,不寫也可以:這里需要的是一個(gè)參數(shù)的類型,切記是類型
		//2>、返回的是描述這個(gè)無參構(gòu)造函數(shù)的類對象。
	
		System.out.println("con = " + con);
		//調(diào)用構(gòu)造方法
		Object obj = con.newInstance();
	//	System.out.println("obj = " + obj);
	//	Student stu = (Student)obj;
		
		System.out.println("******************獲取私有構(gòu)造方法,并調(diào)用*******************************");
		con = clazz.getDeclaredConstructor(char.class);
		System.out.println(con);
		//調(diào)用構(gòu)造方法
		con.setAccessible(true);//暴力訪問(忽略掉訪問修飾符)
		obj = con.newInstance('男');
	}
	
}

后臺輸出:

**********************所有公有構(gòu)造方法*********************************
public fanshe.Student(java.lang.String,int)
public fanshe.Student(char)
public fanshe.Student()
************所有的構(gòu)造方法(包括:私有、受保護(hù)、默認(rèn)、公有)***************
private fanshe.Student(int)
protected fanshe.Student(boolean)
public fanshe.Student(java.lang.String,int)
public fanshe.Student(char)
public fanshe.Student()
fanshe.Student(java.lang.String)
*****************獲取公有、無參的構(gòu)造方法*******************************
con = public fanshe.Student()
調(diào)用了公有、無參構(gòu)造方法執(zhí)行了。。。
******************獲取私有構(gòu)造方法,并調(diào)用*******************************
public fanshe.Student(char)
姓名:男

調(diào)用方法:

1.獲取構(gòu)造方法:
  1).批量的方法:
public Constructor[] getConstructors():所有"公有的"構(gòu)造方法
            public Constructor[] getDeclaredConstructors():獲取所有的構(gòu)造方法(包括私有、受保護(hù)、默認(rèn)、公有)
     
  2).獲取單個(gè)的方法,并調(diào)用:
public Constructor getConstructor(Class... parameterTypes):獲取單個(gè)的"公有的"構(gòu)造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個(gè)構(gòu)造方法"可以是私有的,或受保護(hù)、默認(rèn)、公有;

  調(diào)用構(gòu)造方法:
Constructor-->newInstance(Object... initargs)

2、 newInstance是 Constructor類的方法(管理構(gòu)造函數(shù)的類)
api的解釋為:
newInstance(Object... initargs)
           使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實(shí)例,并用指定的初始化參數(shù)初始化該實(shí)例。
它的返回值是T類型,所以newInstance是創(chuàng)建了一個(gè)構(gòu)造方法的聲明類的新實(shí)例對象。并為之調(diào)用

3、獲取成員變量并調(diào)用

student類:

package fanshe.field;
 
public class Student {
	public Student(){
		
	}
	//**********字段*************//
	public String name;
	protected int age;
	char sex;
	private String phoneNum;
	
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + ", sex=" + sex
				+ ", phoneNum=" + phoneNum + "]";
	}
	
	
}

測試類:

package fanshe.field;
import java.lang.reflect.Field;
/*
 * 獲取成員變量并調(diào)用:
 * 
 * 1.批量的
 * 		1).Field[] getFields():獲取所有的"公有字段"
 * 		2).Field[] getDeclaredFields():獲取所有字段,包括:私有、受保護(hù)、默認(rèn)、公有;
 * 2.獲取單個(gè)的:
 * 		1).public Field getField(String fieldName):獲取某個(gè)"公有的"字段;
 * 		2).public Field getDeclaredField(String fieldName):獲取某個(gè)字段(可以是私有的)
 * 
 * 	 設(shè)置字段的值:
 * 		Field --> public void set(Object obj,Object value):
 * 					參數(shù)說明:
 * 					1.obj:要設(shè)置的字段所在的對象;
 * 					2.value:要為字段設(shè)置的值;
 * 
 */
public class Fields {
 
		public static void main(String[] args) throws Exception {
			//1.獲取Class對象
			Class stuClass = Class.forName("fanshe.field.Student");
			//2.獲取字段
			System.out.println("************獲取所有公有的字段********************");
			Field[] fieldArray = stuClass.getFields();
			for(Field f : fieldArray){
				System.out.println(f);
			}
			System.out.println("************獲取所有的字段(包括私有、受保護(hù)、默認(rèn)的)********************");
			fieldArray = stuClass.getDeclaredFields();
			for(Field f : fieldArray){
				System.out.println(f);
			}
			System.out.println("*************獲取公有字段**并調(diào)用***********************************");
			Field f = stuClass.getField("name");
			System.out.println(f);
			//獲取一個(gè)對象
			Object obj = stuClass.getConstructor().newInstance();//產(chǎn)生Student對象--》Student stu = new Student();
			//為字段設(shè)置值
			f.set(obj, "劉德華");//為Student對象中的name屬性賦值--》stu.name = "劉德華"
			//驗(yàn)證
			Student stu = (Student)obj;
			System.out.println("驗(yàn)證姓名:" + stu.name);
			
			
			System.out.println("**************獲取私有字段****并調(diào)用********************************");
			f = stuClass.getDeclaredField("phoneNum");
			System.out.println(f);
			f.setAccessible(true);//暴力反射,解除私有限定
			f.set(obj, "18888889999");
			System.out.println("驗(yàn)證電話:" + stu);
			
		}
	}

后臺輸出:

************獲取所有公有的字段********************
public java.lang.String fanshe.field.Student.name
************獲取所有的字段(包括私有、受保護(hù)、默認(rèn)的)********************
public java.lang.String fanshe.field.Student.name
protected int fanshe.field.Student.age
char fanshe.field.Student.sex
private java.lang.String fanshe.field.Student.phoneNum
*************獲取公有字段**并調(diào)用***********************************
public java.lang.String fanshe.field.Student.name
驗(yàn)證姓名:劉德華
**************獲取私有字段****并調(diào)用********************************
private java.lang.String fanshe.field.Student.phoneNum
驗(yàn)證電話:Student [name=劉德華, age=0, sex=

由此可見
調(diào)用字段時(shí):需要傳遞兩個(gè)參數(shù):
Object obj = stuClass.getConstructor().newInstance();//產(chǎn)生Student對象--》Student stu = new Student();
//為字段設(shè)置值
f.set(obj, "劉德華");//為Student對象中的name屬性賦值--》stu.name = "劉德華"
第一個(gè)參數(shù):要傳入設(shè)置的對象,第二個(gè)參數(shù):要傳入實(shí)參

4、獲取成員方法并調(diào)用

student類:

package fanshe.method;
 
public class Student {
	//**************成員方法***************//
	public void show1(String s){
		System.out.println("調(diào)用了:公有的,String參數(shù)的show1(): s = " + s);
	}
	protected void show2(){
		System.out.println("調(diào)用了:受保護(hù)的,無參的show2()");
	}
	void show3(){
		System.out.println("調(diào)用了:默認(rèn)的,無參的show3()");
	}
	private String show4(int age){
		System.out.println("調(diào)用了,私有的,并且有返回值的,int參數(shù)的show4(): age = " + age);
		return "abcd";
	}
}

測試類:

package fanshe.method;
 
import java.lang.reflect.Method;
 
/*
 * 獲取成員方法并調(diào)用:
 * 
 * 1.批量的:
 * 		public Method[] getMethods():獲取所有"公有方法";(包含了父類的方法也包含Object類)
 * 		public Method[] getDeclaredMethods():獲取所有的成員方法,包括私有的(不包括繼承的)
 * 2.獲取單個(gè)的:
 * 		public Method getMethod(String name,Class<?>... parameterTypes):
 * 					參數(shù):
 * 						name : 方法名;
 * 						Class ... : 形參的Class類型對象
 * 		public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
 * 
 * 	 調(diào)用方法:
 * 		Method --> public Object invoke(Object obj,Object... args):
 * 					參數(shù)說明:
 * 					obj : 要調(diào)用方法的對象;
 * 					args:調(diào)用方式時(shí)所傳遞的實(shí)參;
):
 */
public class MethodClass {
 
	public static void main(String[] args) throws Exception {
		//1.獲取Class對象
		Class stuClass = Class.forName("fanshe.method.Student");
		//2.獲取所有公有方法
		System.out.println("***************獲取所有的”公有“方法*******************");
		stuClass.getMethods();
		Method[] methodArray = stuClass.getMethods();
		for(Method m : methodArray){
			System.out.println(m);
		}
		System.out.println("***************獲取所有的方法,包括私有的*******************");
		methodArray = stuClass.getDeclaredMethods();
		for(Method m : methodArray){
			System.out.println(m);
		}
		System.out.println("***************獲取公有的show1()方法*******************");
		Method m = stuClass.getMethod("show1", String.class);
		System.out.println(m);
		//實(shí)例化一個(gè)Student對象
		Object obj = stuClass.getConstructor().newInstance();
		m.invoke(obj, "劉德華");
		
		System.out.println("***************獲取私有的show4()方法******************");
		m = stuClass.getDeclaredMethod("show4", int.class);
		System.out.println(m);
		m.setAccessible(true);//解除私有限定
		Object result = m.invoke(obj, 20);//需要兩個(gè)參數(shù),一個(gè)是要調(diào)用的對象(獲取有反射),一個(gè)是實(shí)參
		System.out.println("返回值:" + result);
		
		
	}
}

控制臺輸出:

***************獲取所有的”公有“方法*******************
public void fanshe.method.Student.show1(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
***************獲取所有的方法,包括私有的*******************
public void fanshe.method.Student.show1(java.lang.String)
private java.lang.String fanshe.method.Student.show4(int)
protected void fanshe.method.Student.show2()
void fanshe.method.Student.show3()
***************獲取公有的show1()方法*******************
public void fanshe.method.Student.show1(java.lang.String)
調(diào)用了:公有的,String參數(shù)的show1(): s = 劉德華
***************獲取私有的show4()方法******************
private java.lang.String fanshe.method.Student.show4(int)
調(diào)用了,私有的,并且有返回值的,int參數(shù)的show4(): age = 20
返回值:abcd

由此可見:
m = stuClass.getDeclaredMethod("show4", int.class);//調(diào)用制定方法(所有包括私有的),需要傳入兩個(gè)參數(shù),第一個(gè)是調(diào)用的方法名稱,第二個(gè)是方法的形參類型,切記是類型。
 System.out.println(m);
 m.setAccessible(true);//解除私有限定
 Object result = m.invoke(obj, 20);//需要兩個(gè)參數(shù),一個(gè)是要調(diào)用的對象(獲取有反射),一個(gè)是實(shí)參
 System.out.println("返回值:" + result);//

控制臺輸出:

***************獲取所有的”公有“方法*******************
public void fanshe.method.Student.show1(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
***************獲取所有的方法,包括私有的*******************
public void fanshe.method.Student.show1(java.lang.String)
private java.lang.String fanshe.method.Student.show4(int)
protected void fanshe.method.Student.show2()
void fanshe.method.Student.show3()
***************獲取公有的show1()方法*******************
public void fanshe.method.Student.show1(java.lang.String)
調(diào)用了:公有的,String參數(shù)的show1(): s = 劉德華
***************獲取私有的show4()方法******************
private java.lang.String fanshe.method.Student.show4(int)
調(diào)用了,私有的,并且有返回值的,int參數(shù)的show4(): age = 20
返回值:abcd

其實(shí)這里的成員方法:在模型中有屬性一詞,就是那些setter()方法和getter()方法。還有字段組成,這些內(nèi)容在內(nèi)省中詳解

5、反射main方法

student類:

package fanshe.main;
 
public class Student {
 
	public static void main(String[] args) {
		System.out.println("main方法執(zhí)行了。。。");
	}
}

測試類:

package fanshe.main;
 
import java.lang.reflect.Method;
 
/**
 * 獲取Student類的main方法、不要與當(dāng)前的main方法搞混了
 */
public class Main {
	
	public static void main(String[] args) {
		try {
			//1、獲取Student對象的字節(jié)碼
			Class clazz = Class.forName("fanshe.main.Student");
			
			//2、獲取main方法
			 Method methodMain = clazz.getMethod("main", String[].class);//第一個(gè)參數(shù):方法名稱,第二個(gè)參數(shù):方法形參的類型,
			//3、調(diào)用main方法
			// methodMain.invoke(null, new String[]{"a","b","c"});
			 //第一個(gè)參數(shù),對象類型,因?yàn)榉椒ㄊ莝tatic靜態(tài)的,所以為null可以,第二個(gè)參數(shù)是String數(shù)組,這里要注意在jdk1.4時(shí)是數(shù)組,jdk1.5之后是可變參數(shù)
			 //這里拆的時(shí)候?qū)? new String[]{"a","b","c"} 拆成3個(gè)對象。。。所以需要將它強(qiáng)轉(zhuǎn)。
			 methodMain.invoke(null, (Object)new String[]{"a","b","c"});//方式一
			// methodMain.invoke(null, new Object[]{new String[]{"a","b","c"}});//方式二
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}
}

控制臺輸出:

main方法執(zhí)行了。。。

6、反射方法的其它使用之---通過反射運(yùn)行配置文件內(nèi)容

student類:

public class Student {
	public void show(){
		System.out.println("is show()");
	}
}

配置文件以txt文件為例子(pro.txt):

className = cn.fanshe.Student
methodName = show

測試類:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;
 
/*
 * 我們利用反射和配置文件,可以使:應(yīng)用程序更新時(shí),對源碼無需進(jìn)行任何修改
 * 我們只需要將新類發(fā)送給客戶端,并修改配置文件即可
 */
public class Demo {
	public static void main(String[] args) throws Exception {
		//通過反射獲取Class對象
		Class stuClass = Class.forName(getValue("className"));//"cn.fanshe.Student"
		//2獲取show()方法
		Method m = stuClass.getMethod(getValue("methodName"));//show
		//3.調(diào)用show()方法
		m.invoke(stuClass.getConstructor().newInstance());
		
	}
	
	//此方法接收一個(gè)key,在配置文件中獲取相應(yīng)的value
	public static String getValue(String key) throws IOException{
		Properties pro = new Properties();//獲取配置文件的對象
		FileReader in = new FileReader("pro.txt");//獲取輸入流
		pro.load(in);//將流加載到配置文件對象中
		in.close();
		return pro.getProperty(key);//返回根據(jù)key獲取的value值
	}
}

控制臺輸出:

is show()

需求:當(dāng)我們升級這個(gè)系統(tǒng)時(shí),不要Student類,而需要新寫一個(gè)Student2的類時(shí),這時(shí)只需要更改pro.txt的文件內(nèi)容就可以了。代碼就一點(diǎn)不用改動

要替換的student2類:

public class Student2 {
	public void show2(){
		System.out.println("is show2()");
	}
}

配置文件更改為:

className = cn.fanshe.Student2
methodName = show2

控制臺輸出:

is show2();

7、反射方法的其它使用之---通過反射越過泛型檢查

泛型用在編譯期,編譯過后泛型擦除(消失掉)。所以是可以通過反射越過泛型檢查的

測試類:

import java.lang.reflect.Method;
import java.util.ArrayList;
 
/*
 * 通過反射越過泛型檢查
 * 
 * 例如:有一個(gè)String泛型的集合,怎樣能向這個(gè)集合中添加一個(gè)Integer類型的值?
 */
public class Demo {
	public static void main(String[] args) throws Exception{
		ArrayList<String> strList = new ArrayList<>();
		strList.add("aaa");
		strList.add("bbb");
		
	//	strList.add(100);
		//獲取ArrayList的Class對象,反向的調(diào)用add()方法,添加數(shù)據(jù)
		Class listClass = strList.getClass(); //得到 strList 對象的字節(jié)碼 對象
		//獲取add()方法
		Method m = listClass.getMethod("add", Object.class);
		//調(diào)用add()方法
		m.invoke(strList, 100);
		
		//遍歷集合
		for(Object obj : strList){
			System.out.println(obj);
		}
	}
}

控制臺輸出:

aaa
bbb
100

//反射就總結(jié)到這,下面的內(nèi)省章節(jié)也和反射有關(guān),可以算是反射的高級使用吧,如果有興趣,可以繼續(xù)查看總結(jié)的內(nèi)省部分。

到此這篇關(guān)于Java基礎(chǔ)之反射的文章就介紹到這了,更多相關(guān)Java基礎(chǔ)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java獲得指定區(qū)間數(shù)的方法

    Java獲得指定區(qū)間數(shù)的方法

    這篇文章主要介紹了Java獲得指定區(qū)間數(shù)的方法,涉及java數(shù)值運(yùn)算的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Flask實(shí)現(xiàn)異步非阻塞請求功能實(shí)例解析

    Flask實(shí)現(xiàn)異步非阻塞請求功能實(shí)例解析

    這篇文章主要介紹了Flask實(shí)現(xiàn)異步非阻塞請求功能實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java -length的三種用法說明

    java -length的三種用法說明

    這篇文章主要介紹了java -length的三種用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java中的深拷貝(深復(fù)制)和淺拷貝(淺復(fù)制)介紹

    Java中的深拷貝(深復(fù)制)和淺拷貝(淺復(fù)制)介紹

    這篇文章主要介紹了Java中的深拷貝(深復(fù)制)和淺拷貝(淺復(fù)制)介紹,需要的朋友可以參考下
    2015-03-03
  • java 三元操作符用法說明

    java 三元操作符用法說明

    這篇文章主要介紹了java 三元操作符用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Java讀取json數(shù)據(jù)并存入數(shù)據(jù)庫的操作代碼

    Java讀取json數(shù)據(jù)并存入數(shù)據(jù)庫的操作代碼

    很多朋友問大佬們JAVA怎么把json存入數(shù)據(jù)庫啊,這一問題就把我難倒了,糾結(jié)如何操作呢,下面小編把我的經(jīng)驗(yàn)分享給大家,感興趣的朋友一起看看吧
    2021-08-08
  • Spring中@PathVariable注解的簡單使用

    Spring中@PathVariable注解的簡單使用

    這篇文章主要介紹了Spring中@PathVariable注解的簡單使用,@PathVariable 是 Spring Framework 中的注解之一,用于處理 RESTful Web 服務(wù)中的 URL 路徑參數(shù),它的作用是將 URL 中的路徑變量綁定到方法的參數(shù)上,需要的朋友可以參考下
    2024-01-01
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之?dāng)?shù)組

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之?dāng)?shù)組

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之?dāng)?shù)組,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 新手初學(xué)Java對象內(nèi)存構(gòu)成

    新手初學(xué)Java對象內(nèi)存構(gòu)成

    這篇文章主要介紹了深入理解JVM之Java對象的創(chuàng)建、內(nèi)存布局、訪問定位,結(jié)合實(shí)例形式詳細(xì)分析了Java對象的創(chuàng)建、內(nèi)存布局、訪問定位相關(guān)概念、原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2021-07-07
  • Springboot啟動后執(zhí)行方法小結(jié)

    Springboot啟動后執(zhí)行方法小結(jié)

    本文主要介紹了Springboot啟動后執(zhí)行方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論