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());
-
java程序員必備八大開發工具
現在有很多庫、實用工具和程序任Java開發人員選擇。每個工具都有其優點,但其中有一些因它的知名度、多功能性和有效性從眾多選項中脱穎而出。以下這8個工具,從代碼構建到錯誤擠壓,覆蓋Java開發的全域。學習這些工具可以幫助你改善代碼質量,成為一個更高效的Java開...
-
JAVA認證基礎知識:Java文件解壓縮示例
Java實現壓縮文件的解壓縮操作,缺點是壓縮文件內不能含有文件名為中文的`的文件,否則會出現如下錯誤:Exceptioninthread"main"galArgumentException:MALFORMEDatring(UnknownSource)atLOC(UnknownSource)atextEntry(UnknownSource)at()代碼:package;import;importI...
-
java有哪幾種認證
Sun認證Java程序員考試內容涉及Java所有相關知識、編程概念及applet開發技巧。以下是小編整理的關於java的認證種類,希望大家認真閲讀!Java程序員認證一、怎樣可以獲得Sun公司的Java認證?如果你希望取得Sun公司Java認證,那麼必須通過Java程序員(SCJP)的考試。授...
-
2016年java編譯命令詳解
最近小編重新複習了一下java基礎,這裏便講講對於一個類文件如何編譯、運行、反編譯的。也讓自己加深一下印象如題,首先我們在桌面,開始->運行->鍵入cmd回車,進入windows命令行。進入如圖所示的畫面:可知,當前默認目錄為C盤Users文件夾下的Administrator文件夾。一般...