更新時間:2020-11-23 17:48:43 來源:動力節(jié)點 瀏覽1176次
Java反射(Reflection)就是在運行 Java 程序時,可以加載、探知、使用編譯期間完全未知的類。也就是說,Java 程序可以加載一個運行時才得知類名的類,獲得類的完整構(gòu)造方法,并實例化出對象,給對象屬性設(shè)定值或者調(diào)用對象的方法。本文我們就來通過Java反射實例來理解Java中的反射機制。
一、利用反射獲取類信息的方式、獲取當前類的所有方法和獲取當前類及其父類的所有方法
實體類
package org.dennisit.reflect.entity;
import java.io.Serializable;
public class User implements Serializable{
private String test;
public void execute(String name,int age){
System.out.println("name=" + name + ",age=" + age);
}
}
反射測試類
package org.dennisit.reflect.main;
import java.lang.reflect.Field;
public class ReflectEx {
public static void main(String[] args)throws Exception {
Class cls = Class.forName("org.dennisit.reflect.entity.User");
Object obj = cls.newInstance(); //創(chuàng)建User的對象
Field f = cls.getDeclaredField("test"); //獲取test屬性
f.setAccessible(true); //打開私有屬性test的訪問權(quán)限
f.set(obj, "zhangsan"); //為test重新復(fù)制
System.out.println(f.get(obj)); //獲取obj的test屬性值
//根據(jù)方法名execute獲取方法
java.lang.reflect.Method m = cls.getMethod("execute", String.class, int.class);
m.invoke(obj, "dennisit",23); //調(diào)用execute方法
}
}
運行效果
zhangsan
name=dennisit,age=23
二、編寫一個反射動態(tài)實例化類的例子
package org.dennisit.reflect.main;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
public class DynamicReflect {
public static Object getInstance(String className,Map<String,Object> map)throws Exception{
Class c = Class.forName(className);
Object obj = c.newInstance(); //對象對象
Set<String> keys = map.keySet(); //獲取對應(yīng)的所有屬性
Field[] fAll = c.getDeclaredFields(); //獲取類中所有屬性
for(int i=0;i<fAll.length;i++){
for(String key:keys){ //循環(huán)匹配
if(fAll[i].getName().equals(key)){ //如果用戶傳入的屬性跟獲取到的類中的屬性名匹配
Field f = c.getDeclaredField(key);//獲取該屬性
//構(gòu)建setXxx()方法名
String methodName = "set" + key.substring(0,1).toUpperCase()+key.substring(1);
Method method = c.getMethod(methodName, f.getType());//根據(jù)構(gòu)建的用戶名獲取對應(yīng)的方法
method.invoke(obj, map.get(key));//方法調(diào)用
}else{
continue;
}
}
}
return obj;
}
}
三、接下來我們測試我們編寫的動態(tài)反射實例化例子
實體類
package org.dennisit.reflect.entity;
import java.io.Serializable;
public class User implements Serializable{
private String name;
private int age;
private String email;
public User() { //必須有無參構(gòu)造
}
//getter() and setter()
}
主測試類
package org.dennisit.reflect.main;
import java.util.HashMap;
import java.util.Map;
import org.dennisit.reflect.entity.User;
public class ReflectEx {
public static void main(String[] args)throws Exception {
Class cls = Class.forName("org.dennisit.reflect.entity.User");
String className = "org.dennisit.reflect.entity.User";
Map<String,Object> map = new HashMap<String, Object>();
map.put("name", "dennisit");
map.put("age", 22);
map.put("email", "[email protected]");
User user = (User)DynamicReflect.getInstance(className, map);
System.out.println(user.getName() + "," + user.getAge() + "," + user.getEmail());
}
}
程序運行結(jié)果
dennisit,22,[email protected]
以上就是Java反射實例,借助這些Java反射實例,能夠幫助我們剛好的理解Java反射機制。實際上,反射的工作原理就是借助Class.java、Constructor.java、Method.java、Field.java這四個類在程序運行時動態(tài)訪問和修改任何類的行為和狀態(tài)。想要了解更深層次的反射機制,快來觀看本站的Java基礎(chǔ)教程吧!
初級 202925
初級 203221
初級 202629
初級 203743