奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

JAVA認(rèn)證

JAVA認(rèn)證基礎(chǔ)知識(shí):基于反射機(jī)制的服務(wù)代理調(diào)用

時(shí)間:2024-07-18 18:06:39 煒玲 JAVA認(rèn)證 我要投稿
  • 相關(guān)推薦

JAVA認(rèn)證基礎(chǔ)知識(shí):基于反射機(jī)制的服務(wù)代理調(diào)用

  在軟件開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要對(duì)類、對(duì)象和方法進(jìn)行操作。傳統(tǒng)的方式是通過(guò)直接調(diào)用類和對(duì)象的方法來(lái)實(shí)現(xiàn),但有時(shí)我們無(wú)法預(yù)先獲得這些類和對(duì)象的信息。下面是小編精心整理的JAVA認(rèn)證基礎(chǔ)知識(shí):基于反射機(jī)制的服務(wù)代理調(diào)用,歡迎閱讀與收藏。

JAVA認(rèn)證基礎(chǔ)知識(shí):基于反射機(jī)制的服務(wù)代理調(diào)用

  基于反射機(jī)制的服務(wù)代理調(diào)用

  實(shí)現(xiàn)原理:通過(guò)傳遞服務(wù)bean的名稱、執(zhí)行的方法及參數(shù),通過(guò)反射機(jī)制進(jìn)行調(diào)用返回。

  優(yōu)點(diǎn):只需對(duì)外提供一個(gè)接口服務(wù)即可,只要容器中操作服務(wù)bean,通過(guò)接口即可調(diào)用,增加服務(wù)bean無(wú)需增加對(duì)外接口。

  代碼如下:

  接口類

  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;

  }

  實(shí)現(xiàn)類:

  服務(wù)基于spring,為了方便獲取服務(wù)bean,實(shí)現(xiàn)類實(shí)現(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;

  }

  /**

  * 通過(guò)代理執(zhí)行業(yè)務(wù)方法,方法數(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.");

  }

  //獲取服務(wù)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;

  //處理無(wú)參數(shù)調(diào)用

  if(params == null || params.length ==0){

  try {

  //獲取服務(wù)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;

  }

  //獲取服務(wù)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)用返回?cái)?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對(duì)象

  * @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實(shí)例

  say 為testservice的業(yè)務(wù)方法

  helloword 為參數(shù)

  以上方式可以使用與遠(yuǎn)程調(diào)用(如webservice等),對(duì)外為的代理調(diào)用接口。只需實(shí)現(xiàn)一個(gè)對(duì)外接口,調(diào)用服務(wù)內(nèi)部多個(gè)業(yè)務(wù)服務(wù)。

  Java反射介紹

  Java反射機(jī)制是指在運(yùn)行時(shí)動(dòng)態(tài)地獲取和操作類的信息的能力。通過(guò)反射,我們可以在程序運(yùn)行期間動(dòng)態(tài)地分析、修改和調(diào)用類的方法、構(gòu)造函數(shù)和字段等。這使得我們可以在不直接訪問(wèn)源代碼的情況下,對(duì)類進(jìn)行操作和擴(kuò)展。

  作用

  Java反射機(jī)制為軟件開(kāi)發(fā)人員提供了很多便利,它可以解決以下幾個(gè)常見(jiàn)問(wèn)題:

  動(dòng)態(tài)加載類:通過(guò)反射,我們可以在運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)加載類,而不需要在編譯期間就將所有類都引入到項(xiàng)目中。這樣可以節(jié)省內(nèi)存空間,并且允許我們?cè)谶\(yùn)行時(shí)根據(jù)條件來(lái)選擇加載不同的類。

  動(dòng)態(tài)創(chuàng)建對(duì)象:通過(guò)反射,我們可以在運(yùn)行時(shí)根據(jù)類的信息動(dòng)態(tài)地創(chuàng)建對(duì)象,而不需要在編譯期間就知道具體的類名。這使得我們可以根據(jù)配置文件、用戶輸入或其他條件來(lái)創(chuàng)建不同的對(duì)象。

  動(dòng)態(tài)調(diào)用方法:通過(guò)反射,我們可以在運(yùn)行時(shí)根據(jù)方法名和參數(shù)類型來(lái)動(dòng)態(tài)地調(diào)用類的方法,而不需要在編譯期間就知道具體的方法名和參數(shù)類型。這使得我們可以在不修改源代碼的情況下,對(duì)方法進(jìn)行擴(kuò)展和調(diào)用。

  應(yīng)用場(chǎng)景

  Java反射機(jī)制在實(shí)際開(kāi)發(fā)中有著廣泛的應(yīng)用場(chǎng)景。以下是一些常見(jiàn)的應(yīng)用場(chǎng)景:

  框架和庫(kù):很多框架和庫(kù)都使用了反射機(jī)制來(lái)實(shí)現(xiàn)動(dòng)態(tài)加載和配置,如Spring、Hibernate等。通過(guò)反射,這些框架和庫(kù)可以根據(jù)配置文件來(lái)動(dòng)態(tài)地加載和初始化類,從而提供更大的靈活性和可配置性。

  插件系統(tǒng):插件系統(tǒng)通常需要在運(yùn)行時(shí)動(dòng)態(tài)地加載和卸載插件,以增加軟件的功能和擴(kuò)展性。通過(guò)反射,插件系統(tǒng)可以根據(jù)插件的描述文件來(lái)動(dòng)態(tài)地加載和初始化插件,并調(diào)用插件中定義的方法。

  序列化和反序列化:Java的序列化機(jī)制通過(guò)反射來(lái)實(shí)現(xiàn),它可以將對(duì)象轉(zhuǎn)換成字節(jié)流進(jìn)行傳輸或存儲(chǔ),并在需要的時(shí)候?qū)⒆止?jié)流恢復(fù)成對(duì)象。通過(guò)反射,序列化機(jī)制可以在不知道對(duì)象具體類型的情況下進(jìn)行對(duì)象的讀寫(xiě)操作。

  單元測(cè)試:在單元測(cè)試中,我們經(jīng)常需要對(duì)私有方法進(jìn)行測(cè)試。通過(guò)反射,我們可以獲取到類的私有方法并調(diào)用它們,從而完成對(duì)私有方法的測(cè)試。

【JAVA認(rèn)證基礎(chǔ)知識(shí):基于反射機(jī)制的服務(wù)代理調(diào)用】相關(guān)文章:

Adobe認(rèn)證ning認(rèn)證簡(jiǎn)介12-02

Java與Java web有什么不同01-22

2023年國(guó)際貨運(yùn)代理基礎(chǔ)知識(shí)模擬沖刺習(xí)題及答案08-30

關(guān)于SUN認(rèn)證的作用10-27

Oracle認(rèn)證種類介紹07-21

華為認(rèn)證體系的介紹03-21

Oracle認(rèn)證體系介紹01-30

Linux認(rèn)證考試科目02-02

NIIT認(rèn)證的就業(yè)前景06-26

商務(wù)禮儀的基礎(chǔ)知識(shí) 禮儀基礎(chǔ)知識(shí)05-04

主站蜘蛛池模板: 湘潭市| 永靖县| 凤阳县| 乐安县| 威信县| 石首市| 旬邑县| 偃师市| 万源市| 易门县| 阿合奇县| 北宁市| 苍南县| 鹰潭市| 宜城市| 咸丰县| 平南县| 色达县| 稻城县| 兴业县| 沁阳市| 沂源县| 惠安县| 郑州市| 高唐县| 牡丹江市| 星子县| 舟山市| 日照市| 渑池县| 高要市| 东平县| 博乐市| 青阳县| 大悟县| 大同市| 汝城县| 澄迈县| 宜黄县| 宝清县| 柳江县|