Java反射_笔记(二)

利用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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值