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

java 反射详解

2013-02-02 17:36 267 查看
在设计模式中有一个原则,尽量使用接口而非实现,所以在编译后的class文件中,接口域变量的内容信息中应该会只保存了方法接口的相关信息,而在运行时,实现类作为传入参数执行具体的方法,这样就使得定义与具体实现分离,有利于扩展。

反射机制与接口机制存在一些相似之处,想要对一个类使用反射,必须首先要获取此类的描述信息,包括此类的方法、变量、注解、限制符、父类、子类、构造函数等信息,即首先要获取此类的class类。 在获取class文件之后,你便可以进行任何想要的操作,包括执行构造函数实例化类,执行具体的方法。

class类既可以是接口,也可以是具体实现类,如果是具体实现类,则可以通过newInstance()方法实现对象的实例化,如果为接口则会报错。

在具体方法的反射执行过程中,与类接口的作用方式有点类似:

在编译期间,接口好比为一个占位符,在运行期间才会指向实现类,执行具体的操作。

而class类的通过反射方式:method.invoke(object o,object[] args) 貌似有点类似,编译时占位,运行时根据具体的object执行具体的方法。

那这样做的好处究竟是什么呢?----------减少了代码方法的调用过程。

举例来说,我这里有三个类,A,B,C,项目工程中,可能用到类A,也可能用到类B,也可能用到类C。

如果,不使用反射,则我需要具体实例化A、B、C类,后显示调用他们的方法,因此不可避免的执行三次实例化,和根据方法不同执行具体的方法调用。

但是,如果采用反射方式,我可以通过如下代码来实现:

String className = “”; 外界传值

object[] args = 外界传值

Class<?> objClass = Class.forName(className);

Mehtod[] methods = objeClass.getMethods();

for (Method method : methods)

{

method.invoke(objClass.newInstance(),args);

}

这样,就将初始化和方法调用操作进行了公共的抽取,只需要配置下参数就可以,而不需编写具体的初始化和方法调用操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: