反射
1、Class cls=Class.forName("xxx") #xxx代表配置文件的名字中的类名 Class对象为cls,它可以newInstance一个实例o
2、Object o = cls.newInstance() # 获得该类的对象
3、Method method=cls.getMethod("xxx")#xxx代表配置文件中方法的名字
4、method.invoke(o) #调用方法
在反射中,所有的操作都是反过来的,调用方法在传统方法中是:对象名.方法名,而在这里是方法名.invoke(对象名)
反射会损失速度,下面我们优化提高速度
1、使用setAccessible方法,Method(方法),Field(属性)、Constructor(构造器)都有此方法
2、该方法的作用是启用和禁用访问安全检查的开关,一般来说禁止开关会减少一些性能的损耗。
3、setAccessible参数值为true时表示在使用时会取消访问安全检查,参数为false则进行访问安全检查
class类的常用方法
1、Class.forName(“xxxx”),获取xxxx类对应的Class对象:cls(注意这个不是xxx类的对象,是Class的对象)
2、得到包名 cls.getPackage(),getname()
3、得到类名 cls.getname()
4、通过cls获得对象实例:car cls.newInstance()
5、通过反射获取属性:brand cls.getField(“brand”) //私有属性就报错
获得属性的值:brand.get(car) car是Car类的对象,前面已经获取到了
设置属性的值:brand.set(car,“xxx”)
6、通过反射获得所有属性:cls.getFields() 得到一个集合
for循环可以遍历全部
获取class类对象的4种方法
1、编译阶段 Class.forname(“xxx”) 多用于配置文件、读取类全路径
2、Class类加载阶段 类名.Class 多用于参数传递,通过反射获得构造器对象…
3、Runtime阶段 对象名.getClass() 前提有对象实例
…
反射构造器
获取对象
访问私有的有参构造器方法
访问私有的属性
访问公开的属性
访问私有的方法
具体实例
作业测试:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class reflectionHomework {
public static void main(String[] args) throws Exception{
//利用class获对象
Class<PrivateTest> privateTestClass = PrivateTest.class;
//创建对象实例
PrivateTest privateTestobj = privateTestClass.getDeclaredConstructor().newInstance();
//得到name属性对象
Field field=privateTestClass.getDeclaredField("name");
//爆破
field.setAccessible(true);
//修改name的值
field.set(privateTestobj,"张三");
//获得方法对象
Method getName = privateTestClass.getDeclaredMethod("getName");
//调用方法
Object invoke = getName.invoke(privateTestobj);
System.out.println("name属性的值为:"+invoke);
}
}
class PrivateTest{
private String name="hellokitty";
public String getName() {
return name;
}
@Override
public String toString() {
return "PrivateTest{" +
"name='" + name + '\'' +
'}';
}
}