`

Java反射机制

    博客分类:
  • J2SE
阅读更多

Java反射经典实例 Java Reflection Cookbook

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。

1. 得到某个对象的属性

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1 public Object getProperty(Object owner, String fieldName) throws Exception {
2     Class ownerClass = owner.getClass();
3 
4     Field field = ownerClass.getField(fieldName);
5 
6     Object property = field.get(owner);
7 
8     return property;
9 }

Class ownerClass = owner.getClass():得到该对象的Class。

Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。



2. 得到某个类的静态属性

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 public Object getStaticProperty(String className, String fieldName)
 2             throws Exception {
 3     Class ownerClass = Class.forName(className);
 4 
 5     Field field = ownerClass.getField(fieldName);
 6 
 7     Object property = field.get(ownerClass);
 8 
 9     return property;
10 }


Class ownerClass = Class.forName(className) :首先得到这个类的Class。

Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。

Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。


3. 执行某对象的方法

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
 2 
 3     Class ownerClass = owner.getClass();
 4 
 5     Class[] argsClass = new Class[args.length];
 6 
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10 
11     Method method = ownerClass.getMethod(methodName, argsClass);
12 
13     return method.invoke(owner, args);
14 }

Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

5~9行:配置参数的Class数组,作为寻找Method的条件。

Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。

method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。


4. 执行某个类的静态方法

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 public Object invokeStaticMethod(String className, String methodName,
 2             Object[] args) throws Exception {
 3     Class ownerClass = Class.forName(className);
 4 
 5     Class[] argsClass = new Class[args.length];
 6 
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10 
11     Method method = ownerClass.getMethod(methodName, argsClass);
12 
13     return method.invoke(null, args);
14 }


基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。



5. 新建实例
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 
 2 public Object newInstance(String className, Object[] args) throws Exception {
 3     Class newoneClass = Class.forName(className);
 4 
 5     Class[] argsClass = new Class[args.length];
 6 
 7     for (int i = 0, j = args.length; i < j; i++) {
 8         argsClass[i] = args[i].getClass();
 9     }
10 
11     Constructor cons = newoneClass.getConstructor(argsClass);
12 
13     return cons.newInstance(args);
14 
15 }


这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。

Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。

第5~第9行:得到参数的Class数组。

Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。

cons.newInstance(args):新建实例。


6. 判断是否为某个类的实例

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1 public boolean isInstance(Object obj, Class cls) {
2     return cls.isInstance(obj);
3 }



7. 得到数组中的某个元素
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1 public Object getByArray(Object array, int index) {
2     return Array.get(array,index);
3 }



附完整源码:

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->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);
    }
}
分享到:
评论
1 楼 rogerhunt 2011-01-11  
1, 测试主方法   
    public static void main(String[] args){
      PongBall pb = new PongBall(2,2);
      Reflection ref = new Reflection();
        try {
    //1. 得到某个对象的属性
            Object size =  ref.getProperty(pb, "testSize");
            System.out.println(size);

            //2. 得到某个类的静态属性
            Object size1 =  ref.getStaticProperty("PongBall", "testSize1");
            System.out.println(size1);

            //3. 执行某对象的方法
            Object main =  ref.invokeMethod(pb, "main", args);
           
    //4. 执行某个类的静态方法
            Object main1 =  ref.invokeStaticMethod("PongBall", "main1", args);

            //5. 新建实例
            Object object = ref.newInstance("PongBall", args);
            Object size2 =  ref.getProperty(object, "testSize");
            System.out.println(size2);

            //6. 判断是否为某个类的实例
            System.out.println(ref.isInstance(object, PongBall.class));

            //7. 得到数组中的某个元素
            Object size0 =  ref.getProperty(pb, "size");
            System.out.println(ref.getByArray(size0,0));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2, 被测试类
  import java.util.ArrayList;
  import java.util.List;

  public class PongBall {
      public int[] size;
      public int testSize = 12;
      public static int testSize1 = 12;

      public PongBall(){
         
      }

      public PongBall(int sizeX, int sizeY) {
          this.size = new int[] { sizeX, sizeY };
      }

      public  static String main1() {
          System.out.println("执行某个类的静态方法");
          return null;
      }

      public  String main() {
          System.out.println("执行某对象的方法");
          return null;
      }

  }    

相关推荐

    java反射机制.zip

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

    java 反射机制

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

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

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

    Java 反射机制 代码的实例

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

    Java反射机制的实现_Reflection

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

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

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

    java反射机制

    java反射机制的一些源代码,我学习的笔记,需要的可以下载看看

    JAVA反射机制应用

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

    Java反射机制 Java反射机制

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

    java反射机制核心代码

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

    JAVA 反射机制应用

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

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

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

    候捷谈Java反射机制

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

    java反射机制.md

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

    java反射机制,很安逸.不要错过

    java反射机制,代码/..安逸.不要错过

    java反射机制.xmind

    自己总结的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反射机制源码

Global site tag (gtag.js) - Google Analytics