獲取類的執行時結構、動態建立物件執行方法
阿新 • • 發佈:2021-12-21
獲取類的執行時結構、動態建立物件執行方法
首先建立一個User類
package com.han.reflection; public class UserT { private String id; private String name; private int age; public UserT(){ } public UserT(String id, String name, int age) { this.id = id; this.name = name; this.age = age; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "UserT{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age=" + age + '}'; } private void test(){}; }
獲取類的執行時結構
package com.han.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /* 獲取類的執行時結構 */ public class Test07 { public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException { Class c1 = Class.forName("com.han.reflection.UserT"); //獲得類的名字 System.out.println(c1.getName()); //獲得類的簡稱 System.out.println(c1.getSimpleName()); //獲取所有public屬性 Field[] fields = c1.getFields(); //獲取所有的屬性 Field[] declaredFields = c1.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } //獲得類指定的屬性 Field name = c1.getDeclaredField("name"); System.out.println(name); System.out.println("==========================================="); //獲得類的方法 //獲得指定類類和其父類的所有public方法 Method[] methods = c1.getMethods(); for (Method method : methods) { System.out.println(method); } System.out.println("==========================================="); //獲得指定類的所有方法,包括私有的方法 Method[] declaredMethods = c1.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println(declaredMethod); } System.out.println("==========================================="); //獲得指定的方法 Method getName = c1.getMethod("getName", null); System.out.println(getName); System.out.println("==========================================="); //獲得指定的方法 Method setName = c1.getMethod("setName", String.class); System.out.println(setName); System.out.println("==========================================="); //獲得所有的構造器,只能獲取public Constructor[] constructors = c1.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } System.out.println("==========================================="); //獲得所有的構造器,可以獲取本類所有的構造器 Constructor[] declaredConstructors = c1.getDeclaredConstructors(); for (Constructor declaredConstructor : declaredConstructors) { System.out.println(declaredConstructor); } System.out.println("==========================================="); //獲取指定的構造器 Constructor constructor = c1.getConstructor(String.class, String.class, int.class); System.out.println(constructor); } }
動態建立物件執行方法
package com.han.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /* 動態建立物件執行方法 */ public class Test08 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException { Class c1 = Class.forName("com.han.reflection.UserT"); //本質上呼叫類的無參構造器 UserT user1 = (UserT) c1.newInstance(); System.out.println(user1); System.out.println("========================================="); //通過反射獲得構造器 //呼叫的是有參構造 Constructor constructor = c1.getDeclaredConstructor(String.class, String.class, int.class); UserT user2 = (UserT) constructor.newInstance("zhangsan", "aaa", 1); System.out.println(user2); System.out.println("========================================="); //通過反射呼叫方法 UserT user3 = (UserT) c1.newInstance(); //通過反射獲得一個方法 Method setName = c1.getDeclaredMethod("setName", String.class); //啟用 (物件,值) setName.invoke(user3,"zhangsan1"); System.out.println(user3.getName()); System.out.println("========================================="); //通過反射操作屬性 UserT user4 = (UserT) c1.newInstance(); Field name = c1.getDeclaredField("name"); //不能操作類的私有屬性,通過方法下面方法關閉安全監測 name.setAccessible(true); name.set(user4,"zhangsan2"); System.out.println(user4.getName()); } }