java反射概念

反射
反射:能够分析类能力的程序。是一种功能强大且复杂的机制。
在这里插入图片描述
功能:
1 . 在运行时分析类的能力
2. 在运行时,查看对象。例如编写一个toString()方法供所有类使用。
3. 实现通用的数组操作代码。
4. 利用Method对象,这个对象,很像C++中的函数指针。

class类:java在运行时系统始终为所有的对象维护一个被称为 运行时的类型标识,
这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息,选择相应的方法执行。
Object 类中的getClass()方法将会返回一个Class类型的实例。
三种获取类信息

Emoloyee e;
...
1.  Class c1 = e.getClass();(String name = c2.getName();2.  Class c2 = Class.forName();//获取类名对应的class对象  forName是静态方法
3.  Class c3 = Employee.class; //获取class类对象
               (int.class  //这就是一个class类型的对象)

虚拟机为每个类型管理一个class对象。因此,可以利用==运算符实现两个类对象的比较的操作。

if(e.getClass() == Employee.class)

可以通过 newinstance 方法,动态的创建一个类的实例。
三种方式:

class.forName(""). newinstance();
getClass(). newinstance();//形成实例,通过class实例获取类实例
T.class. newinstance();

利用反射分析类的能力
反射机制最重要的内用----检查类的结构。
在java.lang.reflect包中有三个类 Field Method Constructor 分别描述类的域,方法,构造器
这三个类都有getName()方法用来返回项目的名称。
Field 有 getType() 方法,用来描述域所属类型的Class对象
Method Constructor 有能够报告参数类型的方法,
Method 还有可以报告返回类型的方法
这三个类还有一个叫getModifiers()的方法 返回在这里插入代码片一个整型数值,
用不同的位开关描述public 和 static 这样的修饰符的使用情况

Class类中的getFields,getMethods ,getConstructors 方法将分别返回类提供的public域,
方法和数组,其中包括超类的共有成员。
getDeclareFields,getDeclareMethods ,getDeclareConstructors 方法将分别返回类提供的全部域,方法和数组,其中包括私有和受保护成员。

在运行时使用反射分析对象
已经知道如何获取任意对象的数据域和类型:
获得对应的Class对象 然后通过Class对象调用getDeclareFields
利用反射机制可以查看在编译时还不清楚的对象域
查看对象域的关键时 Fields类里边的 get方法

Emoloyee harry = new Emoloyee (...);
Class c1 = harry.getClass();
Field f = c1.getDeclareField("name");//存在问题 name是私有域,会抛出异常
Object v = f.get(harry);

反射机制的默认行为受限于java的访问控制可以通过setAccesssible()方法三个类都有
实现java程序没有受到安全管理的控制,就可以覆盖访问控制。
可以通过f .set(obj,value)来赋予新值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值