Java.lang.reflect 包下常用的类及方法简介

Class类之主要方法简介

 Class<?> cls = String.class; 

一)类自身的信息

1. 包路径    cls.getPackage();

2. 类名      cls.getName();cls.getSimpleName();

3. 类修饰符  cls.getModifiers();

4. 类属性    cls.getFields();cls.getDeclaredFields();

5. 类方法    cls.getMethods();cls.getDeclaredMethods();

6. 类构造器  cls.getConstructors();

7. 标注信息  cls.getAnnotations(); 

8. 是否为基本类型数据 cls.isPrimitive();

9. 获得系统类的 getClassLoader();   这个也较为常用,加载类的时候 

 

获取资源信息

 

获取方法:

1.object.getClass().getDeclaredMethods() : 会方式所有定义的 public, protected, default private访问权限的方法,但是不会取父类的方法或继承之父类的方法

2.object.getClass().getMethods():会取得所有自身类及父类中所有定义的方法

 

从上面我们可以看出,一般在对于方法的操作我更多是采用第一个方法,做一些属性的COPY,或是方法的调用!较少用到第二个方法! 

 

同理 getFields() && getDeclaredFields() 也是一样的原理. 

 

二)获取资源的信息

 

 cls.getResource("http://xx/xx");

 cls.getResourceAsStream("xx.properties");

 

 

判断一个方法的修饰符

  Modifier.isPublic(method.getModifiers());

        Modifier.isAbstract(method.getModifiers());

        Modifier.isInterface(method.getModifiers());

        Modifier.isFinal(method.getModifiers());

        Modifier.isNative(method.getModifiers());

        Modifier.isPrivate(method.getModifiers());

 

 

那么在Class类操作过程中产生的Field  Method  都可以通过这getModifiers()配合Modifier来得到属性或是方法的修饰符

Field :

1.获得修饰符 field.getModifiers();

2.获取基本的类型的值

    field.getBoolean(obj);

    field.getInt(obj);

    field.getDouble(obj);

    ......

3.获得在属性中的标注 这个特性在1.5版本以后添加,CLASS,METHOD,FIELD 都存在 field.getAnnotations();

 

Method :

1.返回类型 method.getReturnType(); 

2.参数类型 method.getParameterTypes(); 

3.名字  method.getName(); 

4.修饰符 method.getModifiers(); 

5.标注 method.getAnnotations(); 

6.反射调用方法 method.invoke(obj, args);也是最为关键的一个方法


根据上面的这些方法,简单造了一个BeanUtils中对象属性COPY的轮子

package com.inter12.test.myclass;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * TODO Comment of MyBeanUtil
 * 
 * @author inter12
 */
public class MyBeanUtil {

    private static final String SET = "set";
    private static final String IS  = "is";
    private static final String GET = "get";

    public Object beanCopy(Object sourceObject, Class<?> targetClass) throws IllegalArgumentException,
                                                                     IllegalAccessException, InvocationTargetException,
                                                                     InstantiationException {

        // 将目标对象的所有SET方法组转成 name-method 的MAP
        Map<String, Method> targetMethodMap = getTargetMethodMap(targetClass);

        Object targetObject = targetClass.newInstance();

        Method[] sourceMethods = sourceObject.getClass().getDeclaredMethods();
        for (Method m : sourceMethods) {

            // 要求时PUBLIC 且无参的方法
            if (Modifier.isPublic(m.getModifiers()) && m.getParameterTypes().length == 0) {

                // 根据源对象中的get方法,匹配目标对象中是否存在对应的SET方法之,若是无返回NULL
                String methodName = getMethodName(m);

                if (targetMethodMap.containsKey(methodName)) {

                    // 源对象的值
                    Object sourceValue = m.invoke(sourceObject, (Object[]) null);

                    // 设置到目标对象
                    Method targetMethod = targetMethodMap.get(methodName);
                    targetMethod.invoke(targetObject, new Object[] { sourceValue });
                }
            }
        }

        return targetObject;
    }

    private String getMethodName(Method m) {
        String methodName = null;
        if (m.getName().startsWith(GET)) {
            methodName = SET + m.getName().substring(3, m.getName().length());

        } else if (m.getName().startsWith(IS)) {
            methodName = SET + m.getName().substring(2, m.getName().length());
        }
        return methodName;
    }

    private Map<String, Method> getTargetMethodMap(Class<?> targetClass) {

        Map<String, Method> methodMap = new HashMap<String, Method>();

        Method[] targetMethods = targetClass.getDeclaredMethods();
        if (null != targetClass && 0 != targetMethods.length) {
            for (Method method : targetMethods) {

                if (method.getName().startsWith(SET)) {
                    methodMap.put(method.getName(), method);
                }
            }
        }
        return methodMap;
    }

    public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException,
                                          InvocationTargetException, InstantiationException {

        Student student = new Student("xzm", true, 27, new Address("hz"));
        student.setBirthDay(new Date(2011, 11, 1));

        MyBeanUtil myBeanUtil = new MyBeanUtil();

        Object beanCopy = myBeanUtil.beanCopy(student, BakStudent.class);

        System.out.println(beanCopy.toString());
    }
}
 
附件中为完整代码! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值