什么是反射技术?
动态获取指定类以及类中的内容(成员),并运行其内容。应用程序已经运行,无法在其中进行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
邱某