泛型与反射

需求

业务中有两个DTO,需要对这两个DTO中同时包含的一个属性值进行修改,于是可以编写一个泛型方法来进行设置。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private static <T> Boolean setPage2(T t) {
Class page = t.getClass();
try {
Method method = page.getDeclaredMethod("setPageSize", java.lang.Integer.class);//获取方法
method.invoke(t, 48);//调用方法
System.out.println("set successfully!");
return Boolean.TRUE;
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return Boolean.FALSE;
}

理解

通过泛型可以传入不同类型的参数对象,然后使用反射拿到该对象中对某个属性进行设置的方法,再对该方法进行调用,即可完成所需的实现;

注意:getDeclaredMethod函数中一定要申明所需要的方法的参数类型,不然是找不到结果的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private static Method searchMethods(Method[] methods,
String name,
Class<?>[] parameterTypes)
{
Method res = null;
String internedName = name.intern();
for (int i = 0; i < methods.length; i++) {
Method m = methods[i];
if (m.getName() == internedName
&& arrayContentsEq(parameterTypes, m.getParameterTypes())//查找时判断了类型
&& (res == null
|| res.getReturnType().isAssignableFrom(m.getReturnType())))
res = m;
}

return (res == null ? res : getReflectionFactory().copyMethod(res));
}