黑马程序员-Java反射机制

来源:互联网 发布:知进退明得失 姚崇 编辑:程序博客网 时间:2024/05/22 09:52
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------

我所理解的反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们.

Class类

java反射的核心类包括Class,Method,Field等,Class<T>这个类,用过C++的STL的人都熟悉,它代表一个类型.Java里通过它,可以取得这个类的所有信息,包括类的成员,函数,构造函数等信息.我们可以用Class.forName方法通过字符串或得这个类型,如:Class<String>可以通过 Class.forName(“java.lang.String”)取得.也可以通过一个对象,去取得它的Class,如

Object a=new Object();

Class c=a.getClass();//取得一个对象所关联的Class.

有些基本类型,比如int,它不属于什么类(严格地说,是属于java.lang.Number类),所以一般都用int.class直接取得.取得这一个Class对象了,就可以用它的newInstance 创建这个类的实例. 如下面的语句:

Object str=Class.forName(“java.lang.String”).newInstance();

相当于

Object str=new String();

可能很多人看不出上面使用反射机制生成对象有什么优势,下面的写法多简单啊.但请注意,下面的语句是在编代码的时候写死的.而上面语句,如果java.lang.String这个参数是其它字符串,那创建的就是其它类的实例.这个字符串可以来自于磁盘,来自于网络,或来自于用户输入.所以,它就是活的.

当然,上面的问题在于,你只能使用无参数的构造函数,这样肯定不行,所以,需要用Class去取得Constructor对象,再调用它的newInstance函数,就可以通过任意构造函数创建对象了.取得Constructor对象的方法和后面取得Method的方法差不多.

1.类和对象的概念

2.Class类,和Class类的对象的概念.

Field类

它就是类成员变量的对象. Field有一系列的set函数,可以为指定对象的Field设定值.一个Field可以通过Class的getDeclaredField获得.然后使用它的setXXX函数去为某个对象的Field设置值.

Method类

它就是类的成员函数对象.可以使用Class类的getDeclaredMethod取得.这个函数需要指明你想要取得的函数对象的参数信息,因为函数可以重载.

例如,如果类A里面声明了两个函数

public int func(int a,int b);
public int func(String a,String b);
那要取得第一个函数对象,就

A a=new A();
Method m1=a.getClass().getDeclaredMethod(“func”,int.class,int.class);
Method m2=a.getClass().getDeclaredMethod(“func”,Class.forName(“java.lang.String”),Class.forName(“java.lang.String”));

取得了Method对象后,可以使用这个Method对象的invoke函数去调用这个函数.

AccessibleObject类

它是那些可访问类的父类,提供类的成员的访问权限信息,也可以运行时修改它的访问权限:isAccessible/setAccessible 查询和设置.对于私有变量/函数,需要先setAccessible为true,然后才能访问.非常规情况下时,可以用到.

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
原创粉丝点击