對於反射機制原理的理解
阿新 • • 發佈:2018-10-31
反射: 動態獲取一個類的位元組碼檔案物件 從而獲取到物件中的所有的內容(欄位 函式 建構函式等)
1)獲取位元組碼檔案物件 Class
2)通過Class對類進行描述
1.準備好一個實體類
public class Person {
private String name;
private int age;
public void print(){
System.out.println(name+"---------"+age);
}
public void fun(int num,String str){
System.out .println("num="+num+",str="+str);
}
public static void staticFun(){
System.out.println("staticFun run");
}
private void show(){
System.out.println("show run");
}
}
2.獲取位元組碼檔案物件的方式(三種,後兩種較為常見)
// 1.通過物件的getClass()方法獲取
public static void getClassObject01 (){
Person p=new Person();
Class clazz=p.getClass();
Person p1=new Person();
Class clazz1=p1.getClass();
System.out.println(clazz==clazz1);//true
}
// 2.通過資料型別的class屬性獲取該型別的位元組碼檔案物件
public static void getClassObject02(){
Class clazz=Person.class;
System.out .println(clazz.getName());
}
// 使用Class類中的方法獲取 forName(className)
// 不需要明確具體的類或者是物件 只需要類的包名加類名即可
public static void getClassObject03(){
try {
Clas clazz=Class.forName("com.yztc.bean.Person");
System.out.println(clazz.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
3.通過位元組碼檔案物件對類進行描述
// 1. 動態獲取指定的位元組碼檔案物件中的內容
// 位元組碼檔案中的方法
public static void getFuncation(){
//1)獲取位元組碼檔案物件
Class clazz=Person.class;
//2)呼叫Class類中的方法獲取位元組碼檔案物件中的所有的函式
//注意:getMethods()獲取類中的公有方法 ;包括父類中的函式
Method[] meshods=clazz.getMethods();
//獲取類中所有的方法 包含私有 但是不包含繼承父類的
meshods=clazz.getDeclaredMethods();
//3)遍歷
for(Method method:meshods){
System.out.println(method);
}
}
//-----------------------------------------
//2. 獲取類中的單個無引數方法
public static void getSingleFuncation(){
Class clazz=Person.class;
try {
Method method=clazz.getMethod("print", null);//訪問person類中無引數的print()方法
//呼叫位元組碼檔案物件中的newInstance獲取指定的位元組碼檔案物件的例項
Object obj=clazz.newInstance();
method.invoke(obj, null);//呼叫person位元組碼檔案物件例項中的print方法 new person().show();
} catch (Exception e) {
e.printStackTrace();
}
}
//-----------------------------------------
//3.獲取類中帶引數的方法以及靜態方法
public static void getParmasFuncation(){
Class clazz=Person.class;
try {
Method method=clazz.getMethod("fun",int .class ,String.class);
Object obj=clazz.newInstance();
method.invoke(obj, 10,"ok");//new Person().fun(100,"哈哈哈哈哈哈哈哈")
//呼叫靜態函式
Method method2=clazz.getMethod(" staticFun" , null);
method2.invoke(null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
//-----------------------------------------
//4.獲取類中私有方法
public static void getPrivateFuncation(){
Class clazz=Person.class;
try {
Method method=clazz.getDeclaredMethod( "show", null);
//訪問私有方法存在異常 如果想要訪問 暴力訪問 將私有的許可權取消掉
method.setAccessible(true);
Object obj=clazz.newInstance();
method.invoke(obj, null);
} catch (Exception e) {
e.printStackTrace();
}
}
//-----------------------------------------
//5.訪問類中構造方法
public void getconstructor(){
Class clazz= Person.class;
try {
Constructor cons=clazz.getConstructor (null);
Object obj=cons.newInstance(null);
} catch (Exception e) {
e.printStackTrace();
}
}