JAVA反射

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

public static void main(String[] args) throws ClassNotFoundException {
   //第一種
   Class clazz1 = Class.forName("com.lym.bean.Person");
   //第二種
   Class clazz2 = Person.class;
   //第三種
   Person p = new Person();
   Class clazz3 = p.getClass();

}

二、通過配置文件獲取類名並通過無參構造創建類的實例(形如第一種方式)

public static void main(String[] args) throws Exception {

   BufferedReader br = new BufferedReader(new FileReader("config.properties"));
   Class clazz = Class.forName(br.readLine());                //獲取該類的字節碼文件
   Person f = (Person) clazz.newInstance();                  //創建實例對象
   
}

三、通過有參構造創建類的實例

public static void main(String[] args) throws Exception {
   Class clazz = Class.forName("com.lym.bean.Person");
   Constructor c = clazz.getConstructor(String.class,int.class);  //獲取有參構造
   Person p = (Person) c.newInstance("張三",23);                   //通過有參構造創建對象
   System.out.println(p);
}

四、獲取類中的指定字段

Class.getField(String)方法可以獲取類中的指定字段(可見的)

如果是私有的可以用getDeclaedField("name")方法獲取,然後調用setAccessible(true)設置訪問權限,再通過set(obj, "李四")方法可以設置指定對象上該字段的值,調用get(obj)可以獲取指定對象中該字段的值

public static void main(String[] args) throws Exception {
   Class clazz = Class.forName("com.lym.bean.Person");
   Constructor c = clazz.getConstructor(String.class,int.class);  //獲取有參構造
   Person p = (Person) c.newInstance("張三",23);                   //通過有參構造創建對象
   
   //Field f = clazz.getField("name");                         //獲取姓名字段
   //f.set(p, "李四");
   // 修改姓名的值
   Field f = clazz.getDeclaredField("name");                 //暴力反射獲取字段
   f.setAccessible(true);                               //去除私有權限
   f.set(p, "李四");    
   
   System.out.println(p);
}

五、獲取類中的指定方法

Class.getMethod(String,Class...) 和 Class.getDeclaredMethod(String,Class...)方法可以獲取類中的指定方法,調用invoke(Object,Object...)可以調用該方法

public static void main(String[] args) throws Exception {
   Class clazz = Class.forName("com.lym.bean.Person");
   Constructor c = clazz.getConstructor(String.class,int.class);  //獲取有參構造
   Person p = (Person) c.newInstance("張三",23);                   //通過有參構造創建對象
   
   Method m = clazz.getMethod("eat");                      //獲取eat方法
   m.invoke(p);
   
   Method m2 = clazz.getMethod("eat", int.class);             //獲取有參的eat方法
   m2.invoke(p, 10);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章