常用反射工具类
程序员文章站
2022-05-19 14:40:37
...
常用反射方法
- 判断是否包含某个方法
/**
* 判断本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;
}
- 反射复制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;
}
}
}
}
- 反射执行某个方法
/**
* 反射执行方法
* @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;
}
测试
- 测试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 + '\'' +
'}';
}
}
- 测试执行
其中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);
- 测试结果
User{id='1234', userName='null'}
User{id='1234', userName='null'}
User{id='123', userName='null'}
至此,反射方法执行完成。
上一篇: 反射工具类
下一篇: PHP常用函数推荐_PHP教程