什麼是反射技術?
動態取得指定類別以及類別中的內容(成員),並執行其內容。應用程式已經運行,無法在其中進行new物件的建立,就無法使用物件。這時可以根據設定檔的類別全名去找對應的字節碼文件,並載入進內存,並建立該類別物件實例。這就需要使用反射技術完成,還有就是在一個類別中,為了不讓外界存取到有的屬性和方法,通常將其設定為private,這時我們就可以java反射帶來的便利存取類別的私有屬性及方法:
/**Person类****/package com.qiu;public class Person { private String name; private static Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public String toString1() { return "Person [name=" + name + ", age=" + age + "]"; } public String demo(String de) { return de; } }
package com.qiu;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 测试类 * @author qiu * */public class Test { public static void main(String[] args) throws Exception { //加载Person.class文件进内存 Class clazz = Class.forName("com.qiu.Person"); //获取该类指定的属性age getDeclaredField----> 获取所有属性,包括私有 Field field = clazz.getDeclaredField("age"); //获取该类指定的属性name Field field2 = clazz.getDeclaredField("name"); //通过clazz实列化对象 Object obj = clazz.newInstance(); //暴力访问。如果不设置默认为false是访问不到私有属性的。 field.setAccessible(true); //暴力访问。 field2.setAccessible(true); //初始化属性值 field.set(obj, 123); field2.set(obj, "李白"); //获取该字段的值。 Object o = field.get(obj); Object o1 = field2.get(obj); System.out.println(o); System.out.println(o1); /*** 通过更简洁的方法获取指定方法 **/ Method method = clazz.getMethod("getAge", null); System.out.println(method.invoke(obj, null)); /******** 通过反射获取带参数的方法 ******************************/ Class clazz2 = Class.forName("com.qiu.Person"); Method method41 = clazz2.getMethod("demo",String.class); Object obj3 = clazz.newInstance(); System.out.println(method41.invoke(obj3, "邱某")); } }
123
李白
123
邱某
相關文章:
以上是什麼是反射技巧? Java中最常用的反射技術實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!