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文件的时候就把这些数组初始化,效率是否会提高??
- 【反射】JAVA反射机制
- 【Java】JAVA反射机制
- Java 反射机制[Field反射]
- Java 反射机制[Method反射]
- Java反射机制笔记-反射机制
- java的反射机制
- Java的反射机制
- java反射机制详解!
- Java反射机制
- Java的反射机制
- java 反射机制--侯捷
- java反射机制
- java反射机制
- [候捷]Java反射机制
- java 反射机制
- java 反射机制初探
- 关于Java反射机制
- java反射机制
- 链表操作(C++)
- 开发过程
- smarty在普通php页面使用流程
- Java Web中的EL(表达式语言)详解
- C语言多线程
- java反射机制
- 工厂模式学习
- 待补充:java类里的私有变量问题,在对象A里有一个对象B,调用对象B的方法获取变量,会有短暂的缓存
- 12306火车票查询
- 新浪实时股票数据接口http://hq.sinajs.cn/list=code
- [Leetcode]3. Longest Substring Without Repeating Characters
- SAX解析xml文件
- jacob操作office分享
- 读取手机相册,从手机相册读取图片剪切,拍照获取图片,获取拍照图片进行剪切