内省及反射属性复制案例

Posted 艺海浮台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内省及反射属性复制案例相关的知识,希望对你有一定的参考价值。

1、内省

 1 /**
 2  * 测试内省(可以得到从父类继承的get、set方法)
 3  * 
 4  * @author feigu
 5  *
 6  */
 7 public class TestIntrospector {
 8     public static void main(String[] args) {
 9         try {
10             BeanInfo info = Introspector.getBeanInfo(Person.class);
11             // 得到属性描述符
12             PropertyDescriptor[] pds = info.getPropertyDescriptors();
13             for (PropertyDescriptor pd : pds) {
14                 System.out.println(pd.getName());
15                 System.out.println("-------------");
16                 // 得到get方法
17                 System.out.println(pd.getReadMethod());
18                 System.out.println("_______________");
19                 // 得到set方法
20                 System.out.println(pd.getWriteMethod());
21             }
22         } catch (IntrospectionException e) {
23             // TODO Auto-generated catch block
24             e.printStackTrace();
25         }
26     }
27 }

2、反射案例(通过反射实现对象属性的复制)

/**
 * 通过反射实现对象属性的复制
 * @author feigu
 *
 */
public class PersonDemo {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Person p1 = new Person("xiaoming", 12);
        //Person p2 = new Person();
        Dog dog = new Dog();
        // propCopy(p1, p2);
        //promCopy(p1, p2);
        promCopy(p1, dog);
        System.out.println(dog);

    }

    // 通过字段进行属性复制
    public static void propCopy(Person a, Person b) throws Exception {
        Field[] clazz = a.getClass().getDeclaredFields();
        for (Field f : clazz) {
            // String f=field.getName();
            f.setAccessible(true);
            Object ob = f.get(a);
            f.set(b, ob);
            // System.out.println(f);

        }
    }

    // 通过方法进行属性复制
    public static void promCopy(Person a, Dog b) throws Exception {
        Method[] methods_a = a.getClass().getDeclaredMethods();
        Class clazz= b.getClass();
        for (Method mm_a : methods_a) {
            // 方法名
            String m_a = mm_a.getName();
            // c参数类型
            Class[] parameterTypes = mm_a.getParameterTypes();
            // 返回值类型
            Class returnType = mm_a.getReturnType();
            if (m_a.startsWith("get") && (parameterTypes == null || parameterTypes.length == 0)
                    && returnType != void.class) {
                //得到对应参数类型和返回值的b对象方法
                String m_b= m_a.replace("get", "set");
                try {
                    mm_a.setAccessible(true);
                    Method mm_b = clazz.getDeclaredMethod(m_b, returnType);
                    Object obj = mm_a.invoke(a);
                    mm_b.setAccessible(true);
                    mm_b.invoke(b, obj);
                } catch (Exception e) {
                    continue;
                }
                
                }
            }
        }
    }

 3、属性测试

 1 public class TestReflectApp {
 2 
 3     public static void main(String[] args) throws Exception {
 4         //
 5         InputStream is = new FileInputStream("D:\\eclipse-workspace-bigdata4\\Java25\\src\\objects.properties");
 6 //        byte[] bytes = new byte[is.available()];
 7 //        is.read(bytes);
 8 //        //is.close();
 9         //System.out.println(new String(bytes));
10         Properties prop = new Properties();
11         prop.load(is);
12         
13         //
14         String objClass = prop.getProperty("object.class");
15         Class clazz = Class.forName(objClass);
16         Object obj = clazz.newInstance();
17         
18         //name
19         String propName = prop.getProperty("object.prop1.name");
20         String propValue = prop.getProperty("object.prop1.value");
21         Field f = clazz.getDeclaredField(propName);
22         if(f.getType() == String.class){
23             f.setAccessible(true);
24             f.set(obj, propValue);
25         }
26         
27         
28         //name
29         propName = prop.getProperty("object.prop2.name");
30         propValue = prop.getProperty("object.prop2.value");
31         f = clazz.getDeclaredField(propName);
32         if(f.getType() == int.class){
33             f.setAccessible(true);
34             Integer i = Integer.parseInt(propValue) ;
35             f.set(obj, i);
36         }
37         
38     }

 

以上是关于内省及反射属性复制案例的主要内容,如果未能解决你的问题,请参考以下文章

day27(反射之内省机制)

Java反射与内省

反射,内省,BeanUtil的区别

Java内省详解

理解Java的反射与内省及其区别

内省Introspector 和BeanUtils 工具对反射属性的包装(简单的不是一点点哦)