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文件的时候就把这些数组初始化,效率是否会提高??
相关文章推荐
- java 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- Java Web中的EL(表达式语言)详解
- Eclipse无法启动报An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio
- 解决方案java compiler level does not match the version of the installed java project facet
- spring整合mybatis使用<context:property-placeholder>时的坑
- java过滤器和监听器详解
- Java中整数(毫秒数)转换为时分秒毫秒格式(xx:xx:xx.xxx)
- 2016.6.24笔记(1)-本地配置2
- JAVA运算符疑惑
- Java异常处理
- 【Java基础】 Java集合框架List,Map,Set
- Maven学习总结
- java中字母
- Eclipse 代码修改后仍然是之前的运行结果解决办法
- Spring注解-@ModelAttribute
- Eclipse编译apk遇到SystemProperties无法识别解决方法
- springMVC3学习(十二)--文件上传优化CommonsMultipartResolver
- 【深入Java虚拟机】之五:多态性实现机制——静态分派与动态分派
- springMVC3学习(十一)--文件上传CommonsMultipartFile
- java解四元一次方程