當前位置:才華齋>IT認證>JAVA認證>

JAVA認證基礎知識:基於反射機制的服務代理呼叫

JAVA認證 閱讀(1.85W)

實現原理:通過傳遞服務bean的名稱、執行的方法及引數,通過反射機制進行呼叫返回。

JAVA認證基礎知識:基於反射機制的服務代理呼叫

優點:只需對外提供一個介面服務即可,只要容器中操作服務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());