1----------------------------反射的概念-----------------------------------------------
JAVA的反射機制是在運行狀態中,對於一個類可以知道它的屬性和方法,對於一個對象我們可以調用這個對象的屬性和方法,對於這種可以動態的知道類的信息和動態調用的功能稱之為JAVA的反射。
2----------------------------作用-----------------------------------------------------
在運行時調用任意一個對象的方法;
生成動態代理。
3---------------------------基本代碼--------------------------------------------------
(1)涉及到的jdk類
java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
(2)反射實例化
Class c =Class.forName("Employee");
//創建此Class 對象所表示的類的一個新實例
Objecto = c.newInstance(); //調用了Employee的無參數構造方法.
(3)獲取類中的屬性
//獲取整個類
Class c = Class.forName("java.lang.Integer");
//獲取所有的屬性?
Field[] fs = c.getDeclaredFields();
//定義可變長的字符串,用來存儲屬性
StringBuffer sb = new StringBuffer();
//通過追加的方法,將每個屬性拼接到此字符串中
//最外邊的public定義
sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
//里邊的每一個屬性
for(Field field:fs){
sb.append("\t");//空格
sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符,例如public,static等等
sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字
sb.append(field.getName()+";\n");//屬性的名字+回車
}
sb.append("}");
System.out.println(sb);
(3)獲取特定的屬性
public static void main(String[] args) throws Exception{
<span style="white-space:pre"> </span>//以前的方式:
/*
User u = new User();
u.age = 12; //set
System.out.println(u.age); //get
*/
//獲取類
Class c = Class.forName("User");
//獲取id屬性
Field idF = c.getDeclaredField("id");
//實例化這個類賦給o
Object o = c.newInstance();
//打破封裝
idF.setAccessible(true); //使用反射機制可以打破封裝性,導致了java對象的屬性不安全。
//給o對象的id屬性賦值"110"
idF.set(o, "110"); //set
//get
System.out.println(idF.get(o));
}
(4)調用某個類的方法
import java.lang.reflect.Method;
public class TestReflect {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("net.xsoftlab.baike.TestReflect");
// 調用TestReflect類中的reflect1方法
Method method = clazz.getMethod("reflect1");
method.invoke(clazz.newInstance());
// Java 反射機制 - 調用某個類的方法1.
// 調用TestReflect的reflect2方法
method = clazz.getMethod("reflect2", int.class, String.class);
method.invoke(clazz.newInstance(), 20, "張三");
// Java 反射機制 - 調用某個類的方法2.
// age -> 20. name -> 張三
}
public void reflect1() {
System.out.println("Java 反射機制 - 調用某個類的方法1.");
}
public void reflect2(int age, String name) {
System.out.println("Java 反射機制 - 調用某個類的方法2.");
System.out.println("age -> " + age + ". name -> " + name);
}
}