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 = ogger(getClass());
@Resource
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
icationContext = applicationContext;
}
/**
* 通過代理執行業務方法,方法數據
*/
@SuppressWarnings("rawtypes")
@Override
public Object proxy(String beanName, String functionName, String… params) throws ServiceException {
//參數判斷
if(pty(beanName)){
throw new Exception("error: beanName is empty.");
}
if(pty(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 || th ==0){
("proxy params is empty.");
}
Method method = null;
//處理無參數調用
if(params == null || th ==0){
try {
//獲取服務bean方法
method = lass()。getMethod(functionName);
} catch (SecurityException e) {
r("proxy getMethod SecurityException:"+essage());
tStackTrace();
} catch (Exception e) {
r("proxy invoke IllegalArgumentException:"+essage());
tStackTrace();
throw new Exception("error: get method Exception:"+essage());
}
}else{
//處理有參數調用
//處理調用方法參數
Class[] paraTypes = new Class[th];
for (int i = 0; i < th; i++) {
paraTypes[i] = s;
}
//獲取服務bean方法
method = lass()。getMethod(functionName, paraTypes);
}catch (Exception e) {
r("proxy invoke IllegalArgumentException:"+essage());
tStackTrace();
throw new Exception("error: get method Exception:"+essage());
}
}
if(method == null ){
throw new Exception("error: function is not exist.");
}
Object rs = null;
try {
//調用返回數據
rs = ke(bean,params);
} catch (Exception e) {
r("proxy invoke IllegalArgumentException:"+essage());
tStackTrace();
throw new Exception("error: invoke method Exception:"+essage());
}
return rs;
}
/**
* 獲取bean對象
* @param beanName
* @return
*/
private Object getBean(String beanName){
Object bean = null;
bean = ean(beanName);
if(bean == null){
try {
Class classe = ame(beanName);
bean = nstance();
} catch (InstantiationException e) {
r("getBean InstantiationException:"+essage());
tStackTrace();
} catch (IllegalAccessException e) {
r("getBean IllegalAccessException:"+essage());
tStackTrace();
}catch ( ClassNotFoundException e) {
r("getBean ClassNotFoundException:"+essage());
-
2016年Java認證筆試題及答案
一、單項選擇題是從()語言改進重新設計。B.C++calC答案:B2.下列語句哪一個正確()A.Java程序經編譯後會產生machinecode程序經編譯後會產生bytecode程序經編譯後會產生DLLD.以上都不正確答案:B3.下列説法正確的有()s中的constructor不可省略B.constructor必須與cl...
-
Java應用註冊後台服務
項目中有一個java應用程序,交付後用户要求要把這個程序做成後台服務程序,即:系統啟動後該程序可以自動啟動,並且在前台不要出現運行窗口,維護人員只要在服務管理(Windows)中選擇啟動或停止即可.解決辦法如下:Linux在Linux中註冊後台服務程序相對容易,只需編輯/etc/ini...
-
Java的位運算符和邏輯運算符
在許多古老的微處理器上,位運算比加減運算略快,通常位運算比乘除法運算要快很多。在現代架構中,情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算).下面小編準備了關於Java的位運算符和邏輯運算符,提供給大家參考!一.與、或、非、異或運算與0&am...
-
Spring創建Bean過程的方法
1.beans包提供了以編程方式管理和操作bean的基本功能,而context包增加了ApplicationContext,它以一種更加面向框架的方式增強了BeanFactory的功能。2.context包的基礎是位於ext包中的ApplicationContext接口。它是由BeanFactory接口派生而來的,提供了BeanFactory...