反射
Java 反射機制是在運行狀態中,對於任意一個類,都可以獲得這個類都所有屬性和方法;對於任意一個對象,都可以調用它都任意方法和屬性;這種動態獲取信息以及動態調用對象方法都功能實現稱爲 Java 語言的反射機制。
測試
ReflectDemo.java(實體類)
package Reflect;
public class ReflectDemo {
private String res;
public ReflectDemo() {
System.out.println("public無參構造方法");
}
private ReflectDemo(String str) {
System.out.println("private有參構造方法:" + str);
}
public void say(String name) {
System.out.println("public有參方法:" + name);
}
private String hi() {
return "private無參方法:" + res;
}
}
ReflectTest.java(main)
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchFieldException {
//獲取ReflectDemo類
Class rd = ReflectDemo.class;
//實例化ReflectDemo,默認會調用public無參構造器
ReflectDemo reflectDemo = (ReflectDemo) rd.newInstance();
//獲得private有參構造器,傳入參數類型
Constructor constructor = rd.getDeclaredConstructor(java.lang.String.class);
//設置權限(可以訪問private)
constructor.setAccessible(true);
//使用private有參構造器實例化對象,調用private有參構造器
reflectDemo = (ReflectDemo) constructor.newInstance("welcome");
//獲得public有參方法,傳入方法名say以及參數類型String
Method methodPublic = rd.getDeclaredMethod("say", java.lang.String.class);
//調用say方法,傳入reflectDemo對象以及參數值
methodPublic.invoke(reflectDemo, "hello");
//獲得private無參方法,傳入方法名hi
Method methodPrivate = rd.getDeclaredMethod("hi");
//設置權限(可以訪問private)
methodPrivate.setAccessible(true);
//調用hi方法,傳入reflectDemo對象
String strnull = (String) methodPrivate.invoke(reflectDemo);
//由於ReflectDemo類中res屬性未賦值,所以會輸出null
System.out.println(strnull);
//獲取private屬性res,傳入屬性名res
Field field = rd.getDeclaredField("res");
//設置權限(可以訪問private)
field.setAccessible(true);
//設置res屬性值
field.set(reflectDemo, "world");
//調用hi方法,傳入reflectDemo對象
String str = (String) methodPrivate.invoke(reflectDemo);
//此時res屬性已賦值
System.out.println(str);
}
}
運行結果