- 相关推荐
JAVA认证基础知识:基于反射机制的服务代理调用
在软件开发过程中,我们经常需要对类、对象和方法进行操作。传统的方式是通过直接调用类和对象的方法来实现,但有时我们无法预先获得这些类和对象的信息。下面是小编精心整理的JAVA认证基础知识:基于反射机制的服务代理调用,欢迎阅读与收藏。
基于反射机制的服务代理调用
实现原理:通过传递服务bean的名称、执行的方法及参数,通过反射机制进行调用返回。
优点:只需对外提供一个接口服务即可,只要容器中操作服务bean,通过接口即可调用,增加服务bean无需增加对外接口。
代码如下:
接口类
public interface ProxyService {
/**
* webservice调用代理
* @param beanName bean或类名
* @param functionName 调用的函数名
* @param params 参数
* @return
* @throws Exception
*/
Object proxy(String beanName, String functionName,String… params) throws Exception;
}
实现类:
服务基于spring,为了方便获取服务bean,实现类实现spring的ApplicationContextAware接口
@Service
public class ProxyServiceImpl implements ProxyService ,ApplicationContextAware{
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Resource
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 通过代理执行业务方法,方法数据
*/
@SuppressWarnings("rawtypes")
@Override
public Object proxy(String beanName, String functionName, String… params) throws ServiceException {
//参数判断
if(StringUtils.isEmpty(beanName)){
throw new Exception("error: beanName is empty.");
}
if(StringUtils.isEmpty(functionName)){
throw new Exception("error: functionName is empty.");
}
//获取服务bean
Object bean = getBean(beanName);
if(bean == null){
throw new Exception("error: bean is not exist.");
}
if(params == null || params.length ==0){
logger.warn("proxy params is empty.");
}
Method method = null;
//处理无参数调用
if(params == null || params.length ==0){
try {
//获取服务bean方法
method = bean.getClass()。getMethod(functionName);
} catch (SecurityException e) {
logger.error("proxy getMethod SecurityException:"+e.getMessage());
e.printStackTrace();
} catch (Exception e) {
logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
e.printStackTrace();
throw new Exception("error: get method Exception:"+e.getMessage());
}
}else{
//处理有参数调用
//处理调用方法参数
Class[] paraTypes = new Class[params.length];
for (int i = 0; i < paraTypes.length; i++) {
paraTypes[i] = String.class;
}
//获取服务bean方法
method = bean.getClass()。getMethod(functionName, paraTypes);
}catch (Exception e) {
logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
e.printStackTrace();
throw new Exception("error: get method Exception:"+e.getMessage());
}
}
if(method == null ){
throw new Exception("error: function is not exist.");
}
Object rs = null;
try {
//调用返回数据
rs = method.invoke(bean,params);
} catch (Exception e) {
logger.error("proxy invoke IllegalArgumentException:"+e.getMessage());
e.printStackTrace();
throw new Exception("error: invoke method Exception:"+e.getMessage());
}
return rs;
}
/**
* 获取bean对象
* @param beanName
* @return
*/
private Object getBean(String beanName){
Object bean = null;
bean = applicationContext.getBean(beanName);
if(bean == null){
try {
Class classe = Class.forName(beanName);
bean = classe.newInstance();
} catch (InstantiationException e) {
logger.error("getBean InstantiationException:"+e.getMessage());
e.printStackTrace();
} catch (IllegalAccessException e) {
logger.error("getBean IllegalAccessException:"+e.getMessage());
e.printStackTrace();
}catch ( ClassNotFoundException e) {
logger.error("getBean ClassNotFoundException:"+e.getMessage());
e.printStackTrace();
}
}
logger.debug("getBean(),beanName:"+beanName);
return bean;
}
}
调用方式如下:
proxyService.proxy("testservice","say","helloword");
testservice 为spring中bean实例
say 为testservice的业务方法
helloword 为参数
以上方式可以使用与远程调用(如webservice等),对外为的代理调用接口。只需实现一个对外接口,调用服务内部多个业务服务。
Java反射介绍
Java反射机制是指在运行时动态地获取和操作类的信息的能力。通过反射,我们可以在程序运行期间动态地分析、修改和调用类的方法、构造函数和字段等。这使得我们可以在不直接访问源代码的情况下,对类进行操作和扩展。
作用
Java反射机制为软件开发人员提供了很多便利,它可以解决以下几个常见问题:
动态加载类:通过反射,我们可以在运行时根据需要动态加载类,而不需要在编译期间就将所有类都引入到项目中。这样可以节省内存空间,并且允许我们在运行时根据条件来选择加载不同的类。
动态创建对象:通过反射,我们可以在运行时根据类的信息动态地创建对象,而不需要在编译期间就知道具体的类名。这使得我们可以根据配置文件、用户输入或其他条件来创建不同的对象。
动态调用方法:通过反射,我们可以在运行时根据方法名和参数类型来动态地调用类的方法,而不需要在编译期间就知道具体的方法名和参数类型。这使得我们可以在不修改源代码的情况下,对方法进行扩展和调用。
应用场景
Java反射机制在实际开发中有着广泛的应用场景。以下是一些常见的应用场景:
框架和库:很多框架和库都使用了反射机制来实现动态加载和配置,如Spring、Hibernate等。通过反射,这些框架和库可以根据配置文件来动态地加载和初始化类,从而提供更大的灵活性和可配置性。
插件系统:插件系统通常需要在运行时动态地加载和卸载插件,以增加软件的功能和扩展性。通过反射,插件系统可以根据插件的描述文件来动态地加载和初始化插件,并调用插件中定义的方法。
序列化和反序列化:Java的序列化机制通过反射来实现,它可以将对象转换成字节流进行传输或存储,并在需要的时候将字节流恢复成对象。通过反射,序列化机制可以在不知道对象具体类型的情况下进行对象的读写操作。
单元测试:在单元测试中,我们经常需要对私有方法进行测试。通过反射,我们可以获取到类的私有方法并调用它们,从而完成对私有方法的测试。
【JAVA认证基础知识:基于反射机制的服务代理调用】相关文章:
Adobe认证ning认证简介12-02
Java与Java web有什么不同01-22
关于SUN认证的作用10-27
Oracle认证种类介绍07-21
华为认证体系的介绍03-21
Oracle认证体系介绍01-30
Linux认证考试科目02-02
NIIT认证的就业前景06-26
商务礼仪的基础知识 礼仪基础知识05-04