利用Java的反射实现泛型的操作
例(仅指定方法):
被操作的两个方法
public void Demo01(Map<String, Bean> map, List<Bean> list) {
System.out.println("这是Demo01");
}
public Map<String, Bean> Demo02() {
System.out.println("这是Demo02");
return null;
}
对参数的泛型类型进行获取
//获得指定方法的参数的泛型类型
Method clz1 = Test05.class.getMethod("Demo01", Map.class, List.class);
Type[] types1 = clz1.getGenericParameterTypes();//获得参数的泛型类型
for (Type type : types1) {
System.out.println("#" + type);
if (type instanceof ParameterizedType) {
Type[] temps = ((ParameterizedType) type).getActualTypeArguments();
for (Type temp : temps) {
System.out.println("参数的泛型类型" + temp);
}
}
}
对参数的泛型类型进行获取
//获得指定方法的返回值的泛型类型
Method clz2 = Test05.class.getMethod("Demo02", null);
Type type = clz2.getGenericReturnType();//获得返回值的泛型类型
System.out.println("#" + type);
if (type instanceof ParameterizedType) {
Type[] temps = ((ParameterizedType) type).getActualTypeArguments();
for (Type temp : temps) {
System.out.println("返回值的泛型类型" + temp);
}
}
利用Java的反射实现动态编译
E:/java-2018-12/Reflect/src"下的文件,用于测试编译
public class test{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}
动态编译代码
- 注意:由于可变参数是JDK5.0之后才有。m.invoke(null, new String[]{“aa”,“bb”});如果在new String[]{}前不加(Object)强转型的话,会编译成:m.invoke(null,“aa”,“bb”),就发生了参数个数不匹配的问题。
package Reflect.Test;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Test04 {
public static void main(String[] args) {
try {
URL[] urls = new URL[] {new URL("file:/E:/java-2018-12/Reflect/src")};
URLClassLoader loader = new URLClassLoader(urls);
Class clz = loader.loadClass("test");
Method method = clz.getMethod("main", String[].class);
//由于可变参数是JDK5.0之后才有。
//m.invoke(null, new String[]{"aa","bb"});
//如果在new String[]{}前不加(Object)强转型的话,会编译成:m.invoke(null,"aa","bb"),就发生了参数个数不匹配的问题。
method.invoke(clz, (Object)new String[]{});
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果
HelloWorld!