Java基础 | 深入理解反射

什么是反射

面向对象中有一个概念叫封装,我们在编写类的时候会给一些不需要外界调用的字段private修饰,就好比在黑暗里有人在走你看不见,但是用了反射,就像在阳光下拿镜子将阳光反射到了黑暗里的人身上,能够完全获取运行时类的信息,即使这个信息是private的。

C++中的RTTI和Java反射完全不能比,C++反射需要自己去实现,比较复杂,Java提供了API供使用者调用

什么时候使用反射呢?很多时候我们没法确定程序在编写的时候要用到哪些类,比如现在有这样的需求:
从键盘输入一个字符串,输入什么就创建什么类的实例。比如输入Human,就需要在程序中构造一个Human的对象。这样就和我们在面向对象里的new Human()完全不一样了。使用new是因为我们预先知道需要什么实例,但是这个需求里我们没有办法知道要用什么实例。

再说一个经典应用场景,通过url访问Tomcattomcat不知道你会发送什么url,如果发送的是logintomcat会用login反射创建LoginServlet,进而运行Login的逻辑

具体用法

对于任何一个类,都是一个Class类,比如Food类,其Class类就是对Food的抽象,直接看代码

Class class1=Persion.class;

这里的class1就是Persion这个类的Class实例。接着通过class1的一些接口,我们可以拿到运行时,Persion的所有属性,构造器,方法。

Class class1=Persion.class;

Constructor constructor=class1.getConstructor(String.class,int.class);  //这里拿到了Persion的构造器
Persion obj=(Persion)constructor.newInstance("Tom",14);  //通过构造器构造了一个名字叫Tom 年龄是14的人
System.out.println(obj.toString());

Field age = class1.getDeclaredField("age");     //这里拿到的是Persion的属性age
age.set(obj,10);
System.out.println(obj);

Method show = class1.getDeclaredMethod("show");   //Persion的方法show
show.invoke(obj);

Constructor declaredConstructor = class1.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
Object jerry = declaredConstructor.newInstance("Jerry");
System.out.println(jerry);

Field name = class1.getDeclaredField("name");
name.setAccessible(true);                       //通过设置setAccessible(true)可以访问一些private的属性。
name.set(obj,"hanmemei");
System.out.println(obj);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值