标签:
看了别人的那么多文章,总归不是办法;还是自己整理,按照自己的理解来!
1,Class类
说明:此类的实例是标示正在运行的java类或者接口;Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。我们可以根据不同对象的.getClass()获得;
例:Class backupEntityClass = backupEntity.getClass();
方法说明:
注:我主要使用的分为5类
1,获取class forName
2,实例化对象 newInstance();
3,获得属性值(不包括继承的----一定要注意)
4,获得方法(不包括继承的)
5,获得注解
2,Method
说明:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
方法说明:
注:我常用的:获取方法名 执行方法并获得返回值
3,Field
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
我主要用的方法是:get/set 获取或设置属性值
getAnnotation 获得注解
4,PropertyDescriptor
PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
5,运用实例(Copy对象)
package com.yhy.app.basic; import java.beans.IntrospectionException; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class EntityCopyUtil { public <T>T backup(Object entity,Class<T> clazz) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{ Class entityClass = entity.getClass(); Field[] entityFields =entityClass.getDeclaredFields(); T backupEntity = clazz.newInstance(); Class backupEntityClass = backupEntity.getClass(); Field[] backupEntityFields =backupEntity.getClass().getDeclaredFields(); for(Field ef:entityFields){ for(Field bef:backupEntityFields){ if(ef.getName().equals(bef.getName())){ PropertyDescriptor epd = new PropertyDescriptor(ef.getName(),entityClass); Method getMethod = epd.getReadMethod();//获得get方法 PropertyDescriptor bepd = new PropertyDescriptor(bef.getName(),backupEntityClass); Method setMethod = bepd.getWriteMethod();//获得set方法 setMethod.invoke(backupEntity, getMethod.invoke(entity)); } } } return (T) backupEntity; } }
注:上面例子有一个漏洞;我们无法复制父类的属性;那么我们使用的时候怎么解决呢?通过getsuperClass再重新做一次getfiles来实现;
图片都是从API上截取的,一直热衷于API文档 从未被超越!嘿嘿
标签:
原文地址:http://my.oschina.net/u/1249631/blog/377787