欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常用反射工具类

程序员文章站 2022-05-19 14:40:37
...

常用反射方法

常用反射方法

  1. 判断是否包含某个方法
/**
 * 判断本class内是否包含某个属性
 * getDeclaredField 包括类内部public protect defalut 以及private属性
 * getFiled 只包含public 属性 但是也包含继承的属性
 * 同样 getDeclaredMethod  可以判断是否包含某个方法 类似于 getDeclaredField
 * getMethod 类比于getFiled  只包含public 方法,但是也包含继承的方法
 */
public static boolean containFiled(Class<?> clazz, String method) {
    try {
        clazz.getDeclaredField(method);
    } catch (NoSuchFieldException e) {
        return false;
    }
    return true;
}

public static boolean containFileds(Class<?> clazz, List<String> methods) {
    for (String method : methods) {
        try {
            clazz.getDeclaredField(method);
        } catch (NoSuchFieldException e) {
            return false;
        }
    }
    return true;
}
  1. 反射复制Java Bean
/**
 * 思路
 * 1. 传参包括2个对象,分别为源对象和目标对象,可以属于不同的类
 * 2. 获取两对象的Class
 * 3. 获取两对象的属性
 * 4. 遍历目标对象的属性,拼接set方法
 * 5. 遍历源对象的属性,拼接get方法
 * 6. 判断属于相同方法执行 target.setXxx(souce.getXxx)
 *  set的时候判断参数的类型
 * @Param source 源对象
 * @Param target 目标对象
 */
public static void copy(Object source, Object target) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
    Class<?> sourceClass = source.getClass();
    Class<?> targetClass = target.getClass();
    Field[] sourceClassFields = sourceClass.getDeclaredFields();
    Field[] targetClassFields = targetClass.getDeclaredFields();

    for (Field targetClassField : targetClassFields) {
        String targetFirstUpper = targetClassField.getName().substring(0, 1).toUpperCase();
        String setName = "set" + targetFirstUpper + targetClassField.getName().substring(1);
        for (Field sourceClassField : sourceClassFields) {
            if (targetClassField.getName().equals(sourceClassField.getName())) {
                String sourceFirstUpper = sourceClassField.getName().substring(0, 1).toUpperCase();
                String getName = "get" + sourceFirstUpper + sourceClassField.getName().substring(1);


                Method getMethod = sourceClass.getMethod(getName);
                Method setMethod = targetClass.getMethod(setName, sourceClassField.getType());

                Object invoke = getMethod.invoke(source);
                if(invoke != null) {
                    setMethod.invoke(target, new Object[]{invoke});
                }
                break;

            }
        }
    }
}
  1. 反射执行某个方法
/**
 * 反射执行方法
 * @param object 执行的对象
 * @param methodName 方法名
 * @param params 参数数组
 * @return
 */
public static Object invoke(Object object ,String methodName,Object[] params){
    Class<?> objectClass = object.getClass();
    // public 方法 包括父类集成的方法
    Object result = null;
    Method[] methods = objectClass.getMethods();
    for (Method method : methods) {
        if(method.getName().equals(methodName)){
            try {
                result = method.invoke(object, params);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
    return result;
}

测试

  1. 测试Java Bean
public class User {
    private String id;
    private String userName;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", userName='" + userName + '\'' +
                '}';
    }
}
  1. 测试执行
    其中User 和 User4对象参数相同,方法相同。
  //判断对象
User user = new User();
boolean getId = containField(user.getClass(), "getId");
boolean getId2 = containFields(user.getClass(), Arrays.asList("getId","getUserName"));
System.out.println(getId +"========="+getId2);
User user2 = new User();
// 执行方法
Object setId = invoke(user2, "setId", new Object[]{"1234"});
System.out.println(user2);
// java copy
User user3 = new User();
user3.setId("123");
User4 user4 = new User4();
copy(user3,user4);
System.out.println(user4);
  1. 测试结果
User{id='1234', userName='null'}
User{id='1234', userName='null'}
User{id='123', userName='null'}

至此,反射方法执行完成。