javaweb学习笔记(1)-反射

内容:java的反射定义及其实现步骤
类型:笔记
作者:上官国庆
下一篇:javaweb学习笔记(2)-注解

一、反射

1.1定义

将类的各个组成部分封装成其他对象,这就是反射的机制

1.2反射的好处

  1. 可以在程序运行过程中,操作这些对象
  2. 可以解耦,提高程序的可扩展性

1.3反射的示例

class对象功能

  1. 获取成员变量
// 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);
  1. 获取构造方法创建对象
// 获取构造方法的类
Constructor constructor = personClass.getConstructor(String.class,int.class);//构造函数有几个参数,就传递多少个类
// new一个对象
Object person = constructor.newInstance("张三",23);
// 无参构造的话可以直接new一个对象
Object  o = personClass.newInstance();
System,out,println(o);

  1. 获取成员方法

二、反射实现案例

2.1实现

  1. 配置文件
  2. 反射

2.2步骤

  1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件之中
  2. 在程序中加载读取配置文件
  3. 使用反射技术,加载文件进内存
  4. 创建对象
  5. 执行方法
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对象的三种方式

  1. Class.forName(“全类名”); 将字节码文件加载进内存,返回class对象
    • 多用于配置文件,将类名定义在配置文件之中。读取文件加载类
  2. 类名.class; 通过类名的属性class获取
    • 多用于参数传递
  3. 对象.getClass(); getClass()方法在object类中定义着
    • 多用于对象的获取字节码的方式
2.4.1结论

同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值