Java反射机制详解

反射机制是什么?

        反射指的是Java程序具有在运行期间具有分析类和执行类中方法的能力。通过反射我们可以动态地获取一个类的所有属性和方法,即便该属性为私有属性或私有方法。因此,反射破坏了类的封装性。

如何通过反射机制创建对象并调用其属性和方法?

1. 获取Class

        获取类的Class对象一共有四种方法。

(1)通过实例对象调用getClass() 方法来获取,不太常用

Person p1 = new Person();
Class c1 = p1.getClass();

(2) 通过类名.class获取,执行下述代码Cat类不会进行初始化

Class c2 = Cat.class;

(3)通过调用Class类的静态方法forName()获取,不会触发类的初始化

Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");

(4)通过类加载器xxxClassLoader.loadClass()传入类路径,不会触发类的初始化

ClassLoader.getSystemClassLoader().loadClass("cn.lx.Cat");

2. 创建对象

(1)调用class对象的newInstance()方法

Person p1 = (Person) c1.newInstance();
p1.eat();

注意:通过以上方式构造的对象调用了Person类的无参构造函数!! 

(2)使用指定构造方法Constructor来创建对象

Class c = Class.forName("com.lx.Person");
Constructor<Person> con =  c.getDeclaredConstructor(String.class);//调用参数为字符串类型的构造函数
Person p1 = con.newInstance("mary");
p1.eat();

3. 访问属性

Field f = c.getDeclaredField("name");//通过Class对象获取属性
f.setAccessible(true);//name为私有属性
Object val= f.get(p);
System.out.println(val);

注意:setAccessible()方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法、域和构造方法。

4.调用方法

Method m = c.getDeclaredMethod("setName",String.class);//获取方法需要传参:方法名和参数
h.invoke(p1,"xiao ming");//传入目标对象,调用对应的方法
System.out.println(p1.name);

反射机制的应用场景?

框架开发中会大量使用反射机制,同时也大量使用了动态代理,而动态代理的实现也依赖反射。反射被称为框架的灵魂。比如:

  1. Mybatis Plus可以让我们只写接口,不写实现类,就可以执行SQL
  2. 开发项目时,切换不同的数据库只需更改配置文件即可
  3. 类上加上@Component注解,Spring就帮我们创建对象
  4. 在Spring我们只需 @Value注解就读取到配置文件中的值

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值