内容:java的反射定义及其实现步骤
类型:笔记
作者:上官国庆
下一篇:javaweb学习笔记(2)-注解
一、反射
1.1定义
将类的各个组成部分封装成其他对象,这就是反射的机制
1.2反射的好处
- 可以在程序运行过程中,操作这些对象
- 可以解耦,提高程序的可扩展性
1.3反射的示例
- 获取成员变量
// 0、获取Person的class对象
Class personClass = Person.class;
/*
1、获取成员变量
* Field[] getFields() // 获取public的成员变量
* Field getField(String name)
* Field[] getDeclaredFields() //获取所有的成员变量,
* Field getDeclaredField(String name)
*/
// 1、Field[] getFields() 获取所有的public修饰的成员变量
Field[] fields = personClass.getFields();
for(Field field : fields){
System.out.println(field);
}
System.out.println("---------");
Field a = personClasss.getField("a");
// 获取成员变量a的值
Person p = new Person();
Object value = a.get(p);
System,out.println(value);
// 设置a的值
a.set(p,"张三");
System.out.println(p);
// 获取所有的成员变量
getDeclaredFields d = personClasss.getDeclaredFields("a");
// 忽略访问权限修饰符的安全检查
d.setAccessible(true);// 暴力反射
Object value2 = d.get(p);
System,out.println(value2);
- 获取构造方法创建对象
// 获取构造方法的类
Constructor constructor = personClass.getConstructor(String.class,int.class);//构造函数有几个参数,就传递多少个类
// new一个对象
Object person = constructor.newInstance("张三",23);
// 无参构造的话可以直接new一个对象
Object o = personClass.newInstance();
System,out,println(o);
- 获取成员方法
二、反射实现案例
2.1实现
- 配置文件
- 反射
2.2步骤
- 将需要创建的对象的全类名和需要执行的方法定义在配置文件之中
- 在程序中加载读取配置文件
- 使用反射技术,加载文件进内存
- 创建对象
- 执行方法
2.3创建并导入配置文件
加载的配置文件需要以
.properties
后缀节尾,可以直接将配置文件写在src路径下,比如:pro.properties
- 在代码中的应用
// 1.加载配置文件
// 2.创建Properties对象
Properties pro = new Properties();
// 1.2加载配置文件,转化为一个集合
// 1.2.1获取class目录下的配置文件
ClassLoder classLoder = 当前类名.class.getClassLoder();
InputStream is = classLoder.getResourceAsStream("配置文件全称");
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);
2.4获取class对象的三种方式
- Class.forName(“全类名”); 将字节码文件加载进内存,返回class对象
- 多用于配置文件,将类名定义在配置文件之中。读取文件加载类
- 类名.class; 通过类名的属性class获取
- 多用于参数传递
- 对象.getClass(); getClass()方法在object类中定义着
- 多用于对象的获取字节码的方式
2.4.1结论
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次