`
jiapumin
  • 浏览: 344429 次
  • 性别: 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反射机制源码

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

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

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    Java反射机制总结

    ### Java反射机制总结 #### 反射的概念与起源 反射的概念最早由Smith于1982年提出,指的是程序能够访问、检测并修改其自身状态或行为的能力。这一概念的提出迅速引起了计算机科学领域的广泛关注,并在之后的研究中...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    java 反射机制详解

    Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    Java反射机制Demo

    ### Java反射机制详解 #### 一、什么是Java反射机制? Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的...

    java 反射机制例子

    ### Java反射机制详解 #### 一、反射的基本概念与历史背景 反射的概念最早由Smith在1982年提出,其核心思想是程序有能力访问、检测甚至修改自身的状态和行为。这种能力一经提出,迅速成为了计算机科学领域的研究...

    Java 反射机制 代码的实例

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...

    Java反射机制学习(二)

    这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...

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

    Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    java反射机制.md

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

Global site tag (gtag.js) - Google Analytics