Java反射机制---01

来源:互联网 发布:linux查看磁盘权限 编辑:程序博客网 时间:2024/05/17 03:41

反射机制是什么?

反射机制,个人认为就是通过反射这种方式,获取利用反射这个东西的自身的信息,对于程序来说,即能够在程序运行的时候获取自身的信息。在Java中,对于任意中的一个类,我们可以通过Java反射机制获取这个类的所有属性和方法,对于一个对象,我们可以通过Java反射机制调用这个对象的任意方法和属性,简单的来说,在java中只要给定类或者对象的名字,我们就可以通过反射机制来获得这个类或者这个对象的所有信息。

哪里用到了反射机制?

我认为在框架中,基本上都用到了反射机制,如果你自己要写一个框架的话,我认为你一定用到了反射机制,现在很多开源框架都已经封装好了,你基本上自己调用方法或者接口就可以了,不用你自己来写了,典型的有Hibernate,Spring等框架。记得学JDBC的时候,用过一段代码:
Class.forName("com.mysql.jdbc.Driver.class").newInstance();
但是,当时就知道那个是生成驱动对象的实例,也说了是利用反射的机制,但后面没怎么深究反射机制,直到后面工作时,才学了一点点反射的基础知识。其实,我们可以在xml或者properties文件中写好配置,然后在Java类中去解析xml或者properties中的内容,我们可以通过得到的字符串进行反射,得到某个类的Class的实例,这样的话,我们可以动态的配置一些东西,而不需要每次在代码中去new一个实例,以后要修改的话,直接取去修改配置文件即可,这样代码维护起来将会简单多了,再比如一些需求,你不能直接去new一个对象出来,因为你写这个接口的时候,你还不知道这个对象是什么,这样的话,你就可以通过反射机制来调用这个对象方法或者属性。

反射机制的优点和缺点

优点:运行时才绑定对象,体现出反射机制的灵活性,降低类与类之间的耦合性
            运行期判断任意一个对象所属的类
            运行时创建一个类的对象
            运行时判断任意一个类具有的成员变量和方法
            运行时调用一个对象的方法
缺点:性能问题,反射相当于一序列的解析,需要通过JVM做事情,所以性能要比直接创建差
            建议在业务中不要直接使用反射,因为反射是运行时才执行的,如果我们在一个对象中,操作错误比如传错了一个参数的值,导致出现一个运行时的bug,这样发现一个这样的bug很难,因为寻找一个运行时的bug比编译期的bug更难。

Java反射获取的信息

简便的说,就是类中有什么信息,反射就能获取什么信息,但是首先你需要知道这个类的名称。
通过传入的类的全名来创建Class的对象:
Class clazz = Class.forName(“className”);    注:className必须是类的全名,也就是应该包含包名,如:com.core.web.service.UserService
Class clazz = object.getClass();   注:object是传入的Object的参数如:
public void  reflectMethod(Object  object){
                ............       
}
Object  obj  = c.newInstance();   注:创建对象的实例

常使用的方法:

Class  clazz = object.getClass();
(以下的方法,是通过clazz直接调用)
获得构造函数的方法
Constructor  getConstrutor(Class[ ] params);  注:根据指定参数获得public构造器
Constructor[ ]  getConstructors();  注:获得public的所有构造器
Constructor getDeclaredConstructor(Class[ ] params);注:根据指定参数获得public和非public的构造器
Constructor[ ]  getDeclaredConstructors();  注:获得public和非public的所有构造器
获得类中方法的方法
Method  getMethod(String name,Class[ ] params); 注:根据方法名,参数类型获得方法
Method[ ] getMethods();  注:获得所有的public方法
Method  getDeclaredMethod(String name,Class[ ] params);注:根据方法名和参数类型,获得public和非public的方法
Method[ ]  getDeclaredMethods(); 注:获得所有的public和非public方法
获得类中属性的方法
Field  getField(String name); 注:根据变量名得到相应的public变量
Field[ ]  getFields();注:获得类中所有的public方法
Field  getDeclaredField(String  name); 注:根据方法名获得public和非public的变量
Field[ ]  getDeclaredFields();注:获得类中所欲的public和非public方法

0 0
原创粉丝点击