您的位置:首页 > 编程语言 > Java开发

java反射机制

2016-06-24 11:15 211 查看

1 java反射机制的介绍

java反射机制是在运行的状态中,对于任意一个类,能够知道这个类所有的属性和方法;对于任意一个对象,能够调用它的一个方法和属性,这种动态获取信息以及动态调用对象的的功能成为java语言的反射机制。

反射就是把java类中的各种成分映射成相应的java类,如变量、方法、构造方法、包等信息,这些信息的相应类的实例对象俩表示,它们是Field,Method,Construtor,Package等。一个类的每个成员都可以用相应的反射api类的一个实例对象来表示,在java中,我们一般会调用Class类,来调用被反射的Object类下的构造方法、属性、方法等。反射在一些开源框架中用得非常多,如Spring、Hibernate等

2 反射的优缺点

反射虽然很灵活,但是使用不当会影响性能, 用得时候一定要注意具体的应用场景。

优点:

(1) 能够在运行时动态获取类的实例,大大提高系统的灵活性和扩展性。

(2) 与java的动态编译相结合,提供强大的功能。

缺点:

(1) 使用反射的性能较低(查询该类的方法和变量)

(2) 使用反射相对来说不安全

(3) 破坏了类的封装性,可以通过反射获得这个类的私有方法和属性。

java反射获得类

java反射获得类有三种方法

如要获得一个User类,则

// 1 通过Class类的forName方法
Class c1 = Class.forName(User);
// 2 通过类的.class方法
Class c2 = User.class();
// 3 通过对象的getClass()方法
User user = new User();
Class c3 = user.getClass();


在获得Class类之后,我们通过这个类来创建对象

(1) 直接通过Class对象newInstance()方法

Class class = Class.forName(User);
User user = (User)class.newInstance();


(2) 通过class对象获取构造函数来生成对象

Class class = Class.forName(User);
Constructor<T> constructor = class.getConstructor();
User user = constructor.newInstance();


这样做的好处是可以在得到构造函数时添加构造函数的参数。

4 Class类

java的反射是通过Class类来实现的。在运行期间,如果我们要产生某个类的对象,java虚拟机就会检查该类型的的Class对象是否已经被加载,如果没有加载,jvm会根据类的名称来找到.class文件并加载它。

在java中,每个class都有一个对应的Class对象,也就是说我们编写一个类,在编译完成后,在生成的.class文件中,都会产生一个Class对象,用于表示这个类的类型信息。

5 反射的效率问题

java反射存在两个比较容易造成性能损耗的地方:

- (1)Class.forName()方法的调用,需要执行class类文件在整个类路径下的搜索;

- (2)Classd对象的getDeclaredMehthods、getMethods()等方法的调用会执行Methods对象在Class对象上的搜索。

在反射过程中,查找函数是耗时的部门,也就造成了反射效率低下的原因。

在Android中

Android中Class类提供了两个数组

- ArtField[] sFields 存放static变量

- ArtMethod[] virtualMethods; 存放虚拟函数

- ArtMethod[] vtable;

在生成.class文件的时候就把这些数组初始化,效率是否会提高??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: