- 相關推薦
JAVA認證基礎知識:基于反射機制的服務代理調(diào)用
在軟件開發(fā)過程中,我們經(jīng)常需要對類、對象和方法進行操作。傳統(tǒng)的方式是通過直接調(diào)用類和對象的方法來實現(xiàn),但有時我們無法預先獲得這些類和對象的信息。下面是小編精心整理的JAVA認證基礎知識:基于反射機制的服務代理調(diào)用,歡迎閱讀與收藏。
基于反射機制的服務代理調(diào)用
實現(xiàn)原理:通過傳遞服務bean的名稱、執(zhí)行的方法及參數(shù),通過反射機制進行調(diào)用返回。
優(yōu)點:只需對外提供一個接口服務即可,只要容器中操作服務bean,通過接口即可調(diào)用,增加服務bean無需增加對外接口。
代碼如下:
接口類
public interface ProxyService {
/**
* webservice調(diào)用代理
* @param beanName bean或類名
* @param functionName 調(diào)用的函數(shù)名
* @param params 參數(shù)
* @return
* @throws Exception
*/
Object proxy(String beanName, String functionName,String… params) throws Exception;
}
實現(xiàn)類:
服務基于spring,為了方便獲取服務bean,實現(xiàn)類實現(xiàn)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;
}
/**
* 通過代理執(zhí)行業(yè)務方法,方法數(shù)據(jù)
*/
@SuppressWarnings("rawtypes")
@Override
public Object proxy(String beanName, String functionName, String… params) throws ServiceException {
//參數(shù)判斷
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;
//處理無參數(shù)調(diào)用
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{
//處理有參數(shù)調(diào)用
//處理調(diào)用方法參數(shù)
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 {
//調(diào)用返回數(shù)據(jù)
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;
}
}
調(diào)用方式如下:
proxyService.proxy("testservice","say","helloword");
testservice 為spring中bean實例
say 為testservice的業(yè)務方法
helloword 為參數(shù)
以上方式可以使用與遠程調(diào)用(如webservice等),對外為的代理調(diào)用接口。只需實現(xiàn)一個對外接口,調(diào)用服務內(nèi)部多個業(yè)務服務。
Java反射介紹
Java反射機制是指在運行時動態(tài)地獲取和操作類的信息的能力。通過反射,我們可以在程序運行期間動態(tài)地分析、修改和調(diào)用類的方法、構造函數(shù)和字段等。這使得我們可以在不直接訪問源代碼的情況下,對類進行操作和擴展。
作用
Java反射機制為軟件開發(fā)人員提供了很多便利,它可以解決以下幾個常見問題:
動態(tài)加載類:通過反射,我們可以在運行時根據(jù)需要動態(tài)加載類,而不需要在編譯期間就將所有類都引入到項目中。這樣可以節(jié)省內(nèi)存空間,并且允許我們在運行時根據(jù)條件來選擇加載不同的類。
動態(tài)創(chuàng)建對象:通過反射,我們可以在運行時根據(jù)類的信息動態(tài)地創(chuàng)建對象,而不需要在編譯期間就知道具體的類名。這使得我們可以根據(jù)配置文件、用戶輸入或其他條件來創(chuàng)建不同的對象。
動態(tài)調(diào)用方法:通過反射,我們可以在運行時根據(jù)方法名和參數(shù)類型來動態(tài)地調(diào)用類的方法,而不需要在編譯期間就知道具體的方法名和參數(shù)類型。這使得我們可以在不修改源代碼的情況下,對方法進行擴展和調(diào)用。
應用場景
Java反射機制在實際開發(fā)中有著廣泛的應用場景。以下是一些常見的應用場景:
框架和庫:很多框架和庫都使用了反射機制來實現(xiàn)動態(tài)加載和配置,如Spring、Hibernate等。通過反射,這些框架和庫可以根據(jù)配置文件來動態(tài)地加載和初始化類,從而提供更大的靈活性和可配置性。
插件系統(tǒng):插件系統(tǒng)通常需要在運行時動態(tài)地加載和卸載插件,以增加軟件的功能和擴展性。通過反射,插件系統(tǒng)可以根據(jù)插件的描述文件來動態(tài)地加載和初始化插件,并調(diào)用插件中定義的方法。
序列化和反序列化:Java的序列化機制通過反射來實現(xiàn),它可以將對象轉(zhuǎn)換成字節(jié)流進行傳輸或存儲,并在需要的時候?qū)⒆止?jié)流恢復成對象。通過反射,序列化機制可以在不知道對象具體類型的情況下進行對象的讀寫操作。
單元測試:在單元測試中,我們經(jīng)常需要對私有方法進行測試。通過反射,我們可以獲取到類的私有方法并調(diào)用它們,從而完成對私有方法的測試。
【JAVA認證基礎知識:基于反射機制的服務代理調(diào)用】相關文章:
Adobe認證ning認證簡介12-02
Java與Java web有什么不同01-22
關于SUN認證的作用10-27
Oracle認證種類介紹07-21
華為認證體系的介紹03-21
Oracle認證體系介紹01-30
Linux認證考試科目02-02
NIIT認證的就業(yè)前景06-26
商務禮儀的基礎知識 禮儀基礎知識05-04