java反射机制

来源:互联网 发布:怎样增加淘宝销量 编辑:程序博客网 时间:2024/06/05 19:06

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文件的时候就把这些数组初始化,效率是否会提高??

0 0
原创粉丝点击