实例讲解java的反射

实例讲解java的反射
        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; } }

转载于:https://www.cnblogs.com/libran/archive/2008/06/11/2243141.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值