反射
反射:能够分析类能力的程序。是一种功能强大且复杂的机制。
功能:
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)来赋予新值