`

实例解读反射机制

    博客分类:
  • java
阅读更多
package org;
/*
* java的反射在java中是一项很有用的功能,hibernate和spring中都使用了该功能。为了方便大家理解java的反射,下面我写了一个简单的例子,希望对大家的学习有所帮助!

实现反射的类主要包括以下几个:
1、Class 表示一个类的类
2、Field 表示属性的类
3、Method 表示方法的类
4、Constrctor 表示类的构造方法的类
Class类位于java.lang包中,后面三个类都位于java.lang.reflect包中。
*/
/*
* 这是java反射的演示示例,本程序完成的功能是复制一个简单的bean对象。
* 假定bean对象的每个属性都有getXxx()和setXxx()方法。
*/
/*
* 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类中定义的,因此任何对象都可以调用
*/
import java.lang.reflect.*;
public class ReflectTester {
public Object copy(Object object)throws Exception{
Class classType=object.getClass();//与Class.forName(“类名");一样
System.out.println(classType.getName());
//根据传入对象的类型构造一个新的对象
Object objectCopy=classType.newInstance();
//取得传入对象的所有属性
Field fields[]=classType.getDeclaredFields();
//遍历每个属性
for(int i=0;i<fields.length;i++){
//取得一个属性对象
Field field=fields[i];
//取得属性名
String fieldName=field.getName();
//取得属性名称的每一个字母然后转化为大写
String firstChar=fieldName.substring(0,1).toUpperCase();
//构造一个get方法名
String getMethodName="get"+firstChar+fieldName.substring(1);
//构造一个set方法名
String setMethodName="set"+firstChar+fieldName.substring(1);
//根据方法名,分别取得get和set方法
Method getMethod=classType.getMethod(getMethodName, new Class[]{});
Method setMethod=classType.getMethod(setMethodName, new Class[]{field.getType()});
//Method对象的invoke方法,用于动态的执行指定对象的方法。它的第一个参数表示拥有该方法的对象,第二个
//参数表示该方法的参数
//根据传入的对象及其相应的方法对象,就可以调用get方法对象取得相应的属性值了
Object value=getMethod.invoke(object, new Object[]{});
//据新构造的对象,调用set方法对象,就可以为其设置相应的属性值了,
setMethod.invoke(objectCopy, new Object[]{value});

}
return objectCopy;
}
     public static void main(String args[]){
    //新建一个bean类,
    TestBean tb=new TestBean();
    tb.setName("梁小江");
    tb.setAge(100);
    //实例化当前类
    ReflectTester rt=new ReflectTester();
    try{
    //执行copy方法,将新建的Bean类传入
    TestBean tbCopy=(TestBean)rt.copy(tb);
    //测试返回的类属性是否与原来一致
    System.out.println(tbCopy.getName()+"----"+tbCopy.getAge());
    }catch(Exception e){
    e.printStackTrace();
    }
   
     }
}

class TestBean{
private String name;
private int age;
public TestBean(){

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

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics