JAVA类型信息——反射机制

            JAVA类型信息——反射机制

一、反射机制概述

    1、反射机制:就是java语言在运行时拥有的一项自我观察的能力,java通过这种能力彻底了解程序自身的情况,并为下一步的动作做准备。

    2、反射机制的功能

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

       2) 在运行时构造任意一个类的对象(新建类的实例)      

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

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

    3、反射机制的支持

       JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中。

      

类名

功能概述

AccessibleObject

该类是域(field)对象、方法(method)对象、构造函数(constructor)对象的基础类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。

Array

提供动态地生成和访问JAVA数组的方法

Constructor

提供一个类的构造函数的信息以及访问类的构造函数的接口。

Field

提供一个类的域的信息以及访问类的域的接口。

Method

提供一个类的方法的信息以及访问类的方法的接口。

Modifier

提供了 static 方法和常量,对类和成员访问修饰符进行解码。

Proxy

提供动态地生成代理类和类实例的静态方法。

ReflectPermision

指定权限。

 

 

 

    4、获取Class对象的三种方法

方法

实例

ObjectgetClass()

MyObject ob_aMyObject;

Class ob_aClass = ob_aMyObject.getClass();

Class.forName()

Class ob_bClass = Class.forName(“MyObject”);

类字面常量 .class

Class ob_cClass = MyObject.class;

 

 

 

    5Method(方法对象)

方法

功能

getMethods()

获得类的所有公共方法列表。

getMethod(String name, Class[] params)

使用特定的参数类型,获得命名的公共方法

getDexlaredMethods()

获取类中定义了的方法列表。

getDeclaredMethod(String name, Class[] params)

使用特写的参数类型,获得类声明的命名的方法

 

 

 

    6Constructor(构造器对象)

方法

功能

getConstructors()

无参,获得类的所有公共构造函数列表。

getConstructors(

Class[] prarams)

获得使用特殊的参数类型的公共构造函数列表。

getDeclaredConstructors(

Class[] prarams)

获得使用特定参数类型的公共构造函数(与接入级别无关)

getDeclaredConstructors()

获得类的所有构造函数(与接入级别无关)列表。

 

 

 

7Field(属性对象)

方法

功能

getField(String name)

获得命名的公共字段

getFields()

获得类的所有公共字段列表。

getDeclaredField(String name)

获得类声明的命名的字段。

getDeclaredFields()

获得类声明的所有字段列表。

 

 

 

二、应用举例

1、获取系统Date类的方法

import java.lang.reflect.Method;

public class DateMethodsRtti {

      public static void main(String[] args) throws Exception {

             Class<?> ob_aClass = Class.forName("java.util.Date");

             Method[] ob_aMethod_Array = ob_aClass.getDeclaredMethods();

             for(int i=0; i<ob_aMethod_Array.length; i++) {

                    System.out.println(ob_aMethod_Array[i].toString());

             }

      }

}

       运行结果:显示Date所有的方法。

2、下例中的copy()显示了创建一个与参数对象具有同样类型的对象,并且把参数对象中的所有属性拷贝到新建的对象中。

class Customer{

      private Long id;

      private String name;

      private int age;

      public Customer() {}

      public Customer(String name, int age) {

             this.name = name;

             this.age = age;

      }

      public Long getId() {return id;}

      public void setId(Long id) {this.id = id;}

      public String getName() {return name;}

      public void setName(String name) {this.name = name;}

      public int getAge() {return age;}

      public void setAge(int age) {this.age = age;}

}

 

public class ReflectTester {

    public Object copy(Object object) throws Exception{

         //获得对象的类型。

         Class<?> ob_aClass = object.getClass();

         System.out.println("Class : " + ob_aClass.getName());

         //通过默认构造方法创建一个新的对象。

      Object ob_aObject = ob_aClass.getConstructor(new Class[] {}).newInstance(new Object[] {});

         //获得对象的所有属性

         Field[] ob_aField_Array = ob_aClass.getDeclaredFields(); 

         for(int i=0; i<ob_aField_Array.length; i++) {

                Field ob_aField = ob_aField_Array[i];

                String fieldName = ob_aField.getName();

                String firstLetter = fieldName.substring(0, 1).toUpperCase();

                    //获得和属性对应的getXXX()方法的名字

          String getMethodName = "get" + firstLetter + fieldName.substring(1);

                //获得和属性对应的setXXX()方法的名字

        String setMethodName = "set" + firstLetter + fieldName.substring(1);

                //获得和属性对应的getXXX()方法

          Method getMethod = ob_aClass.getMethod(getMethodName, new Class[] {});

                //获得和属性对应的setXXX()方法

          Method setMethod = ob_aClass.getMethod(setMethodName,  new Class[] {ob_aField.getType()});

                //调用远对象的getXXX()方法

          Object ob_bObject = getMethod.invoke(object,                      new Object[] {} );

                System.out.println(fieldName + ":" + ob_bObject);

                setMethod.invoke(ob_aObject, new Object[] {ob_bObject});

         }

         return ob_aObject ;

    }

      public static void main(String[] args) throws Exception{

             Customer ob_aCustomer = new Customer("Tom", 21);

             ob_aCustomer.setId(new Long(1));

       Customer ob_bCustemer = (Customer)

new ReflectTester().copy(ob_aCustomer);

       System.out.println("Copy information :" + ob_bCustemer.getId() + "  " + ob_bCustemer.getName() + "  " + ob_bCustemer.getAge());

      }

}

运行结果:

Class : rtti.Customer

id:1

name:Tom

age:21

Copy information :1  Tom  21

网络文章推荐:http://blog.chinaunix.net/uid-24337578-id-177320.html

              http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html

 

 

 

 

 

 

posted @ 2013-08-24 13:04  血马雄风  阅读(423)  评论(0)    收藏  举报