java反射机制
java反射机制研究及应用
java反射机制提供的功能:
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.在运行时获取泛型信息
5.在运行时调用任意一个对象的成员变量和方法
6.在运行时处理注解‘
7.生成动态代理
反射相关的主要API
java.lang.Class; //代表一个类
java.lang.reflect.Method; //代表类的方法
java.lang.reflect.Field; //代表类的成员变量
java.lang.reflect.Constructor;//代表类的构造器
.......
反射的优缺点
优点
1.提高了java程序的灵活性和扩展性,降低了耦合度,提高了自适应能力
2.允许程序创建和控制任何类的对象,无需提前硬编码目标类
缺点
1.反射性能较低,反射机制主要应用在对灵活性和扩展性要求很高的系统框架上
2.反射会模糊程序内部逻辑,可读性较差。
Person类
package atguigu01_example; public class Person { private String name; public int age; public Person() { System.out.println("Person()..."); } public Person(int age) { this.age = age; } private Person(String name, int age) { this.name = name; this.age = age; } public void show(){ System.out.println("你好,我是一个Person"); } private String showNation(String nation){ return "我的国籍是:"+nation; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
测试类
package atguigu01_example; import org.junit.Test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectionTest { /** * 使用反射之前可以执行的操作 */ @Test public void test1(){ //1.创建Person的实例 Person p1=new Person(); //2.调用属性 p1.age=10; System.out.println(p1.age); //调用方法 p1.show(); } /** * 使用反射完成上述操作 */ @Test public void test2() throws Exception { //1.创建Person的实例 Class clazz=Person.class; Person p1= (Person) clazz.newInstance(); System.out.println(p1); //2.调用属性 Field ageField=clazz.getField("age"); ageField.set(p1,10); System.out.println(ageField.get(p1)); //调用方法 Method showMethod=clazz.getMethod("show"); showMethod.invoke(p1); } /** * 出了Person类后,就不能直接调用Person类中声明的private权限修饰的结构 * 但是可以通过反射的方式调用PerSon类中私有的结构 -->暴力反射 */ @Test public void test3() throws Exception { //调用私有构造器 Class clazz=Person.class; Constructor cons=clazz.getDeclaredConstructor(String.class,int.class); cons.setAccessible(true); Person p1=(Person)cons.newInstance("Tom",12); System.out.println(p1); //调用私有的属性 Field name = clazz.getDeclaredField("name"); name.setAccessible(true); name.set(p1,"Jerry"); System.out.println(name.get(p1)); //调用私有方法 Method showNationMethod=clazz.getDeclaredMethod("showNation", String.class); showNationMethod.setAccessible(true); String info= (String) showNationMethod.invoke(p1,"CHN"); System.out.println(info); } }

浙公网安备 33010602011771号