反射
注意:下方的getFields()方法只能是获取public 修饰的成员变量
而且,for中的sout无法执行
但是呢,在下面的getDeclaredFields( )方法中,无论是private还是public都可以获取;但是不包括父类的声明
暴力反射:
在Field中d.setAccessible(true);会忽略访问权限的安全检查;
获取Constructor
- 创建对象(newInstance是其方法)
- Object person = constructor. newInstance(“张三”);
sout; - 可以使用空参数构造方法创造对象,比较简单:Class对象的newInstance方法
获取成员方法Method
-
不带declared的只能够访问public的,不带的任何都可以获取
-
方法的三要素,方法名,参数列表
-
Method eat_method = personClass.getMethod(“eat”);
-
执行方法(空参)
eat_method.invoke§;
personClass.getMethod
eat_method2.invoke§;
Method eat_method2 + personClass.getMethods -
获取方法名,
案例
步骤:写出一个框架,在不改变该类任何代码的前提下,他可以帮我们创建任意类的对象,执行其中任意方法
- 首先定义了两个类,person和student
- person中含有private修饰的age和name,以及eat有参无参的方法
- student中含有无参的sleep方法
- 然后在创建一个框架:reflectTest类,psvm
- 实现
- 1 配置文件
- 2 反射
步骤
以后修改只需要改变配置文件就可以了
public class ReflectTest {
/*
* 框架类
* */
public static void main(String[] args) throws Exception, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException {
/*
* 前提是不能够改变,该类的代码
* 可以创建任意类的对象,执行任意的方法
* */
// 1.加载配置对象
// 1.1创建Properties对象
Properties pro = new Properties();
// 1.2加载配置文件,转化为一个集合
// 1.2.1获取class文件目录下的配置文件
ClassLoader classLoader = ReflectTest.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
// 2.获取配置文件中定义的数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
// 3.加载该类进内存
Class cls = Class.forName(className);
// 4.创建对象
Object obj = cls.newInstance();
// 5.获取方法对象
Method method = cls.getMethod(methodName);
// 6.执行方法
method.invoke(obj);
}
}
注解
在文件夹生成html文件见黑马30天第12个
- 注解的三个预定义的方法