Reflection 是 Java 被视为动态(或准动态)语言的关键,允许程序于执行期 Reflection APIs 取得任何已知名称之 class 的內部信息,包括 package、type parameters、superclass、implemented interfaces、inner classes, outer class, fields、constructors、methods、modifiers,並可于执行期生成instances、变更 fields 內容或唤起 methods。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

  1. 得到某个对象的属性

    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;
    
    } 
    
  2. 得到某个类的静态属性

     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;
     } 
    

Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object

Field类:

提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。

Constructor类:

提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。

Method类:

提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。

Class类:

类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。

Object类:

每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 通过反射访问私有变量或私有函数

     /**  
      * 获取成员变量Field  
      * getField()  
      * getDeclaredField()  
      * */ 
     Field mem = cls1.getDeclaredField("name");  
     mem.setAccessible(true); //设置可访问的权限     
     System.out.println("we get form field :"+mem.get(obj)); 

Class类:

获取类的构造器

首先介绍一下Constructor类,这个类用来封装反射得到的构造器,Class有四个方法来获得Constructor对象

     public Constructor<?>[] getConstructors() 返回类中所有的public构造器集合,默认构造器的下标为0 

     public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回指定public构造器,参数为构造器参数类型集合 

     public Constructor<?>[] getDeclaredConstructors() 返回类中所有的构造器,包括私有 

     public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回任意指定的构造器 

示例: 遍历所有构造函数,生成对象

     public static void main(String[] args) {
             Class<?> demo=null;
             try{
                 demo=Class.forName("Reflect.Person");
             }catch (Exception e) {
                 e.printStackTrace();
             }
             Person per1=null;
             Person per2=null;
             Person per3=null;
             Person per4=null;
             //取得全部的构造函数
             Constructor<?> cons[]=demo.getConstructors();
             try{
                 per1=(Person)cons[0].newInstance();
                 per2=(Person)cons[1].newInstance("Rollen");
                 per3=(Person)cons[2].newInstance(20);
                 per4=(Person)cons[3].newInstance("Rollen",20);
             }catch(Exception e){
                 e.printStackTrace();
             }
             System.out.println(per1);
             System.out.println(per2);
             System.out.println(per3);
             System.out.println(per4);
         }

获取类的成员变量

     public Field getDeclaredField(String name) 获取任意指定名字的成员 

     public Field[] getDeclaredFields() 获取所有的成员变量 

     public Field getField(String name) 获取任意public成员变量 

     public Field[] getFields() 获取所有的public成员变量 

获取类的方法

     public Method[] getMethods() 获取所有的共有方法的集合 

     public Method getMethod(String name,Class<?>... parameterTypes) 获取指定公有方法 参数1:方法名 参数2:参数类型集合 

     public Method[] getDeclaredMethods() 获取所有的方法 

     public Method getDeclaredMethod(String name,Class<?>... parameterTypes) 获取任意指定方法 

参考链接:

http://java.ccidnet.com/art/3539/20070924/1222147_1.html

http://www.cnblogs.com/bingoidea/archive/2009/06/21/1507889.html

标签: none

添加新评论