实例讲解java的反射(http://blog.csdn.net/accp_fangjian/article/details/2535822)

java的反射在java中是一项很有用的功能,hibernate和spring中都使用了该功能。为了方便大家理解java的反射,下面我写了一个简单的例子,希望对大家的学习有所帮助!

实现反射的类主要包括以下几个:
1、Class 表示一个类的类
2、Field 表示属性的类
3、Method 表示方法的类
4、Constrctor 表示类的构造方法的类
Class类位于java.lang包中,后面三个类都位于java.lang.reflect包中。
下面请看例子,注释在程序中:
/** 
 
 * @description 这是java反射的演示示例,本程序完成的功能是复制一个简单的bean对象。假定bean对象的每个属性都有getXxx()和setXxx()方法。 
 
 * @author fangjian 2008.06.11 
 
 */  
  
  
  
import java.lang.reflect.*;  
  
  
  
public class ReflecTester {  
  
    public Object copy(Object object) throws Exception  
  
    {  
  
        //Class类是java反射中的核心类,有几个常用方法:  
  
        //1、getName() 以String形式返回类的名称  
  
        //2、getFields()返回所有public类型的属性   
  
        //3、getField(String name)返回指定名称的属性对象   
  
        //4、getDeclaredFields() 以数组形式返回类的所有属性对象  
  
        //5、getMethod(String name, Class[] parameterTypes) 返回指定的方法对象,name表示方法名称,parameterTypes表示参数类型  
  
        //6、getConstructors()获得默认的构造方法  
  
        //7、getConstructor(Class[] parameterTypes)获得特定的构造方法,parameterTypes为构造方法的参数类型  
  
          
  
        //获得传入的对象的类型(getClass()方法用于获得对象的类型,它是在Object类中定义的,因此任何对象都可以调用)  
  
        Class classType=object.getClass();  
  
        System.out.println(classType.getName());  
  
          
  
        //根据传入对象的类型,构造一个新的对象  
  
        Object objectCopy=classType.newInstance();  
  
          
  
        //取得传入的对象的所有属性,本例包括name和age  
  
        Field fields[]=classType.getDeclaredFields();  
  
          
  
        //遍历每个属性  
  
        for(int i=0;i<fields.length;i++)  
  
        {  
  
            //取得一个属性对象  
  
            Field field=fields[i];  
  
            //取得属性的名字,例如:name  
  
            String fieldName=field.getName();  
  
            //取得属性名称的第一个字母,然后转换成大写,例如:N  
  
            String firstChar=fieldName.substring(0, 1).toUpperCase();  
  
            //构造一个get方法名,例如:getName  
  
            String getMethodName="get"+firstChar+fieldName.substring(1);  
  
            //构造一个set方法名,例如:setName  
  
            String setMethodName="set"+firstChar+fieldName.substring(1);  
  
              
  
            //根据方法的名字,取得Method对象,下面两行语句分别取得了get和set方法对象  
  
            Method getMothod=classType.getMethod(getMethodName, new Class[]{});  
  
            Method setMothod=classType.getMethod(setMethodName, new Class[]{field.getType()});  
  
              
  
            //Method对象的invoke方法,用于动态的执行指定对象的方法。它的第一个参数表示拥有该方法的对象,第二个  
  
            //参数表示该方法的参数  
  
              
  
            //根据传入的对象及其相应的方法对象,就可以调用get方法对象取得相应的属性值了,例如:zhaona  
  
            Object value=getMothod.invoke(object, new Object[]{});  
  
            //根据新构造的对象,调用set方法对象,就可以为其设置相应的属性值了,例如:zhaona  
  
            setMothod.invoke(objectCopy, new Object[]{value});            
  
        }  
  
        return objectCopy;  
  
    }  
  
      
  
    public static void main(String[] args)   
  
    {  
  
        //新建一个bean类,并设置值  
  
        TestBean tb=new TestBean();  
  
        tb.setName("zhaona");  
  
        tb.setAge(26);  
  
          
  
        //实例化当前类  
  
        ReflecTester rt=new ReflecTester();  
  
        try {  
  
            //执行copy方法,将新建的bean类传入  
  
            TestBean tbCopy=(TestBean)rt.copy(tb);  
  
            //测试返回的类的各个属性是否与原类一致  
  
            System.out.print(tbCopy.getName()+"-----"+tbCopy.getAge());  
  
        } catch (Exception e) {  
  
            e.printStackTrace();  
  
        }  
  
          
  
    }  
  
}  
  
//测试使用的类  
  
class TestBean{  
  
    String name;  
  
    int age;  
  
    public int getAge() {  
  
        return age;  
  
    }  
  
    public String getName() {  
  
        return name;  
  
    }  
  
    public void setAge(int age) {  
  
        this.age = age;  
  
    }  
  
    public void setName(String name) {  
  
        this.name = name;  
  
    }  
  
} 

 

posted on 2014-11-18 14:47  HI,你的蚊香  阅读(87)  评论(0)    收藏  举报