一:java中反射调用举例:
1,写一个类,作为后面被反射调用的类及对方法。
类名:TcpProcessService,方法名:execute。
public class TcpProcessService {
public String execute(TcpSendTask task,String deviceId){
System.out.println("the task is "+task+" the deviceId is: "+deviceId);
return task+deviceId;
}
}
2,通过Class类得到“全包名类”的Class对象,然后反射调用其对应的方法(方法名可以是上游传来的,也可以是从数据库中查询出来的,此处为了简单直接在代码中写死)。
注意getMethod方法及invoke方法的传参。
String result =(String)Class.forName("testForFun.demo20181116.demo01_reflect.TcpProcessService").getMethod("execute", new Class[]{TcpSendTask.class, String.class}).invoke(Class.forName("testForFun.demo20181116.demo01_reflect.TcpProcessService").newInstance(), new Object[]{task, "PLC0001"});
System.out.println("result::"+result);
二:Spring中反射的使用举例:
1,创建一个类继承ApplicationContextAware,继承ApplicationContextAware 来获取Bean
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext context;//声明一个静态变量保存
public void setApplicationContext(ApplicationContext context) throws BeansException {
ApplicationContextUtil.context = context;
}
public static ApplicationContext getContext() {
return context;
}
}
2,将ApplicationContextAware 配置进application-context.xml
<!-- Spring 容器上下文获取 Utils -->
<bean id="ApplicationContextUtil" class="testForFun.demo2000Utils.ApplicationContextUtil"/>
3,将TcpProcessService放入Spring中
<bean id="tcpProcessService" class="testForFun.demo20181116.demo01_reflect.TcpProcessService"/>
4,在Spring中反射调用。
String result =(String)ApplicationContextUtil.getContext().getBean("tcpProcessService").getClass().getMethod("execute", new Class[]{TcpSendTask.class, String.class}).invoke(ApplicationContextUtil.getContext().getBean("tcpProcessService"), new Object[]{bean.getBizParam(), "PLC0001"});
System.out.println("result::"+result);
三:附录
附录一:Api1:Class.forName(String className);
附录二:Api2:Class.getMethod(String methodName,Class<?>...parameterTypes);
附录三:Api3:Method.invoke(Object obj,Object ...args)