欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java的反射机制,

来源: javaer 分享于  点击 35357 次 点评:174

java的反射机制,


反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力,即程序可以在运行时访问、检测和修改它本身状态或行为的一种能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。下面具体介绍一下java的反射机制。这里你将颠覆原来对java的理解。 

Java的反射机制的实现要借助于4个类:classConstructorFieldMethod;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组 成部分。

Java 反射机制主要提供了以下功能

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法

Java反射的优缺点:

       静态编译:在编译时确定类型,绑定对象,即通过。 
      动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 
       一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中 它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编 译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如 这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能 的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功 能。 
        它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 满足我们的要求。这类操作总是慢于只直接执行相同的操作。 并且它饶过了源码,会干扰原来的内部逻辑。一般普通程序的情况慎重使用反射。

import java.lang.reflect.Array;   
import java.lang.reflect.Constructor;   
import java.lang.reflect.Field;   
import java.lang.reflect.Method;   
  
  
/**  
 * Java Reflection Cookbook  
 *  
 * @author Michael Lee  
 * @since 2006-8-23  
 * @version 0.1a  
 */  
  
public class Reflection {   
    /**  
     * 得到某个对象的公共属性  
     *  
     * @param owner, fieldName  
     * @return 该属性对象  
     * @throws Exception  
     *  
     */  
    public Object getProperty(Object owner, String fieldName) throws Exception {   
        Class ownerClass = owner.getClass();   
  
        Field field = ownerClass.getField(fieldName);   
  
        Object property = field.get(owner);   
  
        return property;   
    }   
  
    /**  
     * 得到某类的静态公共属性  
     *  
     * @param className   类名  
     * @param fieldName   属性名  
     * @return 该属性对象  
     * @throws Exception  
     */  
    public Object getStaticProperty(String className, String fieldName)   
            throws Exception {   
        Class ownerClass = Class.forName(className);   
  
        Field field = ownerClass.getField(fieldName);   
  
        Object property = field.get(ownerClass);   
  
        return property;   
    }   
  
  
    /**  
     * 执行某对象方法  
     *  
     * @param owner  
     *            对象  
     * @param methodName  
     *            方法名  
     * @param args  
     *            参数  
     * @return 方法返回值  
     * @throws Exception  
     */  
    public Object invokeMethod(Object owner, String methodName, Object[] args)   
            throws Exception {   
  
        Class ownerClass = owner.getClass();   
  
        Class[] argsClass = new Class[args.length];   
  
        for (int i = 0, j = args.length; i < j; i++) {   
            argsClass[i] = args[i].getClass();   
        }   
  
        Method method = ownerClass.getMethod(methodName, argsClass);   
  
        return method.invoke(owner, args);   
    }   
  
  
      /**  
     * 执行某类的静态方法  
     *  
     * @param className  
     *            类名  
     * @param methodName  
     *            方法名  
     * @param args  
     *            参数数组  
     * @return 执行方法返回的结果  
     * @throws Exception  
     */  
    public Object invokeStaticMethod(String className, String methodName,   
            Object[] args) throws Exception {   
        Class ownerClass = Class.forName(className);   
  
        Class[] argsClass = new Class[args.length];   
  
        for (int i = 0, j = args.length; i < j; i++) {   
            argsClass[i] = args[i].getClass();   
        }   
  
        Method method = ownerClass.getMethod(methodName, argsClass);   
  
        return method.invoke(null, args);   
    }   
  
  
  
    /**  
     * 新建实例  
     *  
     * @param className  
     *            类名  
     * @param args  
     *            构造函数的参数  
     * @return 新建的实例  
     * @throws Exception  
     */  
    public Object newInstance(String className, Object[] args) throws Exception {   
        Class newoneClass = Class.forName(className);   
  
        Class[] argsClass = new Class[args.length];   
  
        for (int i = 0, j = args.length; i < j; i++) {   
            argsClass[i] = args[i].getClass();   
        }   
  
        Constructor cons = newoneClass.getConstructor(argsClass);   
  
        return cons.newInstance(args);   
  
    }   
  
  
       
    /**  
     * 是不是某个类的实例  
     * @param obj 实例  
     * @param cls 类  
     * @return 如果 obj 是此类的实例,则返回 true  
     */  
    public boolean isInstance(Object obj, Class cls) {   
        return cls.isInstance(obj);   
    }   
       
    /**  
     * 得到数组中的某个元素  
     * @param array 数组  
     * @param index 索引  
     * @return 返回指定数组对象中索引组件的值  
     */  
    public Object getByArray(Object array, int index) {   
        return Array.get(array,index);   
    }   
}  

相关文章

    暂无相关文章
相关栏目:

用户点评