`
jiapumin
  • 浏览: 341563 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 反射机制(转)

阅读更多
(一) 初识Java Reflection
    Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的classes.这句话可能有点难以理解,我们可以通过一个例子来看。在Java程序中我们经常会用到这样一条语句来创建一个对象。Date date = new Date();在这条语句中date的类型(Java.util.Date)在编译时 已经确定。那么,有没有办法使我们把对象类型的确定时间由编译转到运行,答案是肯定的。这就是Java反射机制所提供的便利。而且它不单单可以生成对象还可以获取Field,对Field设值,及调用方法等。

  主要有三种方法。

  二,通过.Type或.class属性获得。Class cla = String.class;Class cla1 = int.Type;

  如上所示实例对象cla就是对String类型的描述,通过它我们就可以创建一个String实例,并调用其中的方法。下一篇我将通过一个例子来展示如何使用Java反射机制。

(二)例子
  下面我以顾客买相机为例来说明Java反射机制的应用。例子中涉及的类和接口有:

  Camera接口:定义了takePhoto()方法。

  Camera01类:一种照相机的类型,实现Camera接口。

  Camera02类:另一种照相机的类型,实现Camera接口。

  Seller类:卖照相机。

  Customer类:买相机,有main方法。

  所有类都放在com包里

  程序如下:

public interface Camera {
  //声明照相机必须可以拍照
public void takePhoto();
}
public class Camera01 implements Camera {
private final int prefixs =300;//300万象素
private final double optionZoom=3.5; //3.5倍变焦
public void takePhoto() {
 System.out.println("Camera01 has taken a photo");
}
}

  类似的有

public class Camera02 implements Camera {
private final int prefixs =400;
private final double optionZoom=5;
public void takePhoto() {
 System.out.println("Camera02 has taken a photo");
}
}

  顾客出场了
public class Customer {
public static void main(String[] args){
 //找到一个售货员
 Seller seller = new Seller();
 //向售货员询问两种相机的信息
 seller.getDescription("com.Camera01");
 seller.getDescription("com.Camera02");
 //觉得Camera02比较好,叫售货员拿来看
 Camera camera =(Camera)seller.getCamera("com.Camera02");
 //让售货员拍张照试一下
 seller.testFuction(camera, "takePhoto");
}
}

  Seller类通过Java反射机制实现
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Seller {
//向顾客描述商品信息
public void getDescription(String type){
 try {
 Class cla = Class.forName(type);
 //生成一个实例对象,在编译时我们并不知道obj是什么类型。
 Object obj = cla.newInstance();
 //获得type类型所有已定义类变量及方法。
 Field[] fileds = cla.getDeclaredFields();
 Method[]methods = cla.getDeclaredMethods();
 System.out.println("The arguments of this Camera is:");
 for(int i=0;i<fileds.length;i++){
  fileds[i].setAccessible(true);
  //输出类变量的定义及obj实例中对应的值
  System.out.println(fileds[i]+":"+fileds[i].get(obj));
 }
 System.out.println("The function of this Camera:");
 for(int i=0;i<methods.length;i++){
  //输出类中方法的定义
  System.out.println(methods[i]);
 }
 System.out.println();
 } catch (Exception e) {
 System.out.println("Sorry , no such type");
 }
}
//使用商品的某个功能
public void testFuction(Object obj,String function){
 try {
 Class cla = obj.getClass();
 //获得cla类中定义的无参方法。
 Method m = cla.getMethod(function, null);
 //调用obj中名为function的无参方法。
 m.invoke(obj, null);
 } catch (Exception e) {
 System.out.println("Sorry , no such function");
 
 }
}
//拿商品给顾客
public Object getCamera(String type){
 try {
 Class cla = Class.forName(type);
 Object obj = cla.newInstance();
 return obj;
 } catch (Exception e) {
 System.out.println("Sorry , no such type");
 return null;
 }
}
}

  程序到此结束,下一篇我将对程序进行分析,并补充一些内容。
(三)例子分析
  上一篇中,通过例子我们知道了如何利用反射机制创建对象,获得类变量和调用方法等。创建对象的语句是 Class cla = Class.forName(type);  Object obj = cla.newInstance(); 这里newInstance()实际上是使用了该类的默认无参构造方法。如果我们要调用其它的构造方法就要稍微复杂一点。比如我们要创建一个StringBuffer对象,用new 操作符应该是StringBuffer br = new StringBuffer("example");用反射机制则要有以下步骤。

  首先,获得StringBuffer类的描述。

  Class cla = Class.forName("java.lang.StringBuffer");

  其次,要创建参数类型数组Class[] 。

  Class[] paraTypes = new Class[1];paraTypes[0]=String.class;

  然后,通过cla 和 paraTypes 获得Constructor 对象。

  Constructor constructor = cla.getConstructor(paraTypes);

  接着,创建传入的参数列表Object[]。

  Object[] paraLists = new Object[1]; paraLists[0]="color";

  最后,得到我们所要得对象。Object obj = constructor.newInstance(paraLists);

  如果我们paraTypes及paraLists设为null或长度为0,就可以用上述步骤调用StringBuffer的无参构造方法。类似地,我们可以调用对象中的有参方法。比如我们做如下操作br.insert(4, 'u');用反射机制实现如下。
Class[] paratypes = new Class[]{int.class,char.class};
Method method = cla.getMethod("insert", paratypes);
Object[] paralists = new Object[]{4,'u'};
method.invoke(obj, paralists);

  反射机制给予我们运行时才确定对象类型的便利,然而它也有显著的缺点。

  1,代码笨拙冗长。比如本来一句br.insert(4, 'u');可以解决的问题现在要用到四句。

  2,损失了编译时类型检查的好处。这使得你要对付更多的异常。

  3,性能损失。用反射机制运行的时间更久。

  <<Effective Java >>中给出的建议是“普通应用不应在运行时刻以映像方式访问对象,只是在很有限的情况下使用“。那么在什么地方会用到反射机制呢。已有的较熟悉应用是我们的IDE及一些框架。比如eclipse,编程时ctrl+space弹出的建议就是用到反射机制。比如Spring读取配置文件后生成对应的对象。还有RPC系统也会用到。对于一般的应用软件,你可以在工厂方法中用到它。
分享到:
评论

相关推荐

    java反射机制.zip

    java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...

    Java反射机制 Java反射机制

    Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制Java反射机制

    JAVA 反射机制应用

    JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用

    java反射机制原理和反射机制总结

    java反射机制原理和反射机制总结!!! java反射机制原理和反射机制总结!!!

    反射实例-JAVA反射机制.doc

    反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    Java反射机制课件ppt

    Java反射机制Java反射机制Java反射机制Java反射机制

    JAVA反射机制应用

    描述JAVA反射机制应用、举例。描述反射机制的具体实现及方法实现。

    Java 反射机制 代码的实例

    Java 反射机制 代码的实例 请认真阅读 运行此代码 只要读懂了 反射机制也就明白了

    java反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    Java反射机制的实现_Reflection

    Java反射机制的实现_Reflection,适合学习了解反射机制。

    Java反射机制经典案例

    Java 反射机制、Java 的类反射机制、Java 反射机制的学习、Java 反射Reflection--运行时生成实例 java反射机制的手册文档

    java 反射机制

    java 反射机制深入理解,java 反射机制深入理解,java 反射机制深入理解,

    Java反射机制总结

    这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。 所有文章均从网络途径获得,本人只作收集整理的工作,个别地方有改动。每篇文章的标题遵循原作者的表述,本人不再作任何更改。 关键字有:...

    候捷谈Java反射机制

    候捷谈Java反射机制 有助深入理解Java新特性

    Java反射机制总结(实例分析)

    Java反射机制总结(实例分析) Java反射机制学习笔记

    一个例子让你了解Java反射机制

    一个例子8个demo让你了解Java反射机制

    java反射机制.md

    深入了解java反射机制的原理,通过反射机制可以破坏单例模式,如何防止通过反射机制拿到单例模式的构造器呢?用枚举类可破

    java反射机制核心代码

    java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);

    java反射机制应用

    java反射机制应用,文档中列举了使用java反射机制的各个应用场景,加以代码实例,使用学习非常方便。

Global site tag (gtag.js) - Google Analytics