(1)reflection反射机制被视为动态语言(运行时改变内部结构的语言)的关键,借助于反射API取得任何累的内部信息,并能直接操作任意对象的内部属性和方法。
(2)加载完类之后,在堆内存的方法中就产生了一个Class类型的对象,这个对象包含了完整的类的结构信息,可以通过这个类看到类的结构。
// 反射: 实例化对象---------》getclass()方法---------------》得到完整的“包类”信息
(3)功能:
在运行时 判断对象所属的类、构造任意一个类的对象、判断任意一个类所具有的成员变量和方法、获取泛型信息 、调用任意一个对象的成员变量和方法、处理注解,生成动态代理
API:java.lang.Class 代表一个类
java.lang.reflect.Method 代表类方法
java.lang.reflect.Field 代表类的成员变量
java.lang.reflect.Construtor 代表类的构造器
package com.qiku.reflection;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReflection {
//反射之前
@Test
public void test01(){
//创建Person对象
Person p1 = new Person("tom",12);
p1.age=10;
System.out.println(p1);//Person{name='tom', age=10}
p1.show();
//不可调用其私有的成员变量和方法 例如 name 和shownation()
}
//反射之后 对于Person的操作
@Test
public void test02() throws Exception {
Class cc= Person.class;
// 通过反射 创建 person对象
Constructor cons = cc.getConstructor(String.class, int.class);
Object obj = cons.newInstance("Tom", 12);
Person p=(Person)obj;
System.out.println(p.toString());
//通过反射 获取对象指定的属性和方法
Field age = cc.getDeclaredField("age");
age.set(p,10);//
System.out.println(p.toString());//Person{name='Tom', age=10}
Method show = cc.getDeclaredMethod("show");
System.out.println(show);
//通过反射 可以调用 Person类的私有属性,比如私有的构造器方法和属性
//调用私有的构造器
Constructor cons1 = cc.getConstructor(String.class);
//值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java
// 语言访问检查;实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 ;
//由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
cons1.setAccessible(true);
Person p1 =(Person) cons1.newInstance("Jerry");
System.out.println(p1);
//调用私有的属性
Field name = cc.getDeclaredField("name");
name.setAccessible(true);
name.set(p1,"Jack");
System.out.println(p1);
//调用私有的方法
Method showNation = cc.getDeclaredMethod("showNation",String.class);
showNation.setAccessible(true);
//相当于 p1.showNation("中国"); 调用完此方法有个返回值 invoke的返回值就是nation
String nation = (String)showNation.invoke(p1, "中国");
System.out.println(nation);
}
}



