java動態代理的demo(java動態代理的時候參數異常)

本文目錄一覽:

java動態代理有什麼應用,舉幾個例子看看,可以的話解釋一下

import java.lang.reflect.Proxy;

A. 創建一個實現介面InvocationHandler的類,他必須實現invoke方法

B. 創建被代理的類以及介面。

C. 通過Proxy的靜態方法newProxyInstance(ClassLoader loader,Class【】interfaces,InvocationHandler handler)創建一個代理

D. 通過代理調用方法。

java動態代理:是在運行是生成的class對象,在生成時必須提供一組或一個interface給它,然後該class就宣稱它實現了這些interface。你當然可以把該class的實例當做這些interface中的任何一個來用,當然,這個DynamicProxy其實就是一個Proxy,他不會替你做實質性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作。因此,DynamicProxy必須實現InvocationHandler介面。

5) 一個動態代理了和一個InvocationHandler 實現關聯的。每一個動態代理實例的調用都要通過InvocationHandler介面的handler(調用處理器)來調用,動態代理不做任何執行操作,只是在創建動態代理時,把要實現的介面和handler關聯,動態代理要幫助被代理執行的任務,要轉交給handler來執行。其實就是調用invoke方法。

java動態代理怎樣實現?

在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對介面的的實現。

其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler介面。

Proxy類主要用來獲取動態代理對象,InvocationHandler介面用來約束調用者實現,如下,HelloWorld介面定義的業務方法,HelloWorldImpl是HelloWorld介面的實現,HelloWorldHandler是InvocationHandler介面實現。代碼如下:

業務介面:

public interface HelloWorld {

void sayHelloWorld() ;

}

業務介面實現:

public class HelloWorldImpl implements HelloWorld {

public void sayHelloWorld() {

System.out.println(“Hello World!”);

}

}

InvocationHandler實現,需要在介面方法調用前後加入一部份處理工作,這裡僅僅在方法調用前後向後台輸出兩句字元串,其代碼如下:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class HelloWorldHandler implements InvocationHandler {

//要代理的原始對象

private Object objOriginal;

/**

* 構造函數。

* @param obj 要代理的原始對象。

*/

public HelloWorldHandler(Object obj) {

this.objOriginal = obj ;

}

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result ;

//方法調用之前

doBefore();

//調用原始對象的方法

result = method.invoke(this.objOriginal ,args);

//方法調用之後

doAfter();

return result ;

}

private void doBefore() {

System.out.println(“before method invoke!”);

}

private void doAfter() {

System.out.println(“after method invoke!”);

}

}

測試代碼:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

public class Test {

public static void main(String[] args) {

HelloWorld hw = new HelloWorldImpl();

InvocationHandler handler = new HelloWorldHandler(hw);

HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(

hw.getClass().getClassLoader(),

hw.getClass().getInterfaces(),

handler);

proxy.sayHelloWorld();

}

}

�0�1 首先獲取一個業務介面的實現對象;

�0�1 獲取一個InvocationHandler實現,此處是HelloWorldHandler對象;

�0�1 創建動態代理對象;

�0�1 通過動態代理對象調用sayHelloWorld()方法,此時會在原始對象HelloWorldImpl. sayHelloWorld()方法前後輸出兩句字元串。

運行測試類輸出如下:

before method invoke!

Hello World!

after method invoke!

此處Test類中的方法調用代碼比較多,在我們的實際應用中可以通過配置文件來來簡化客戶端的調用實現。另外也可以通過動態代理來實現簡單的AOP

JAVA動態代理設計原理及如何實現

ava動態代理機制的出現,使得Java開發人員不用手工編寫代理類,只要簡單地制定一組介面及委託類對象,便能動態地獲得代理類。代理類會負責將所有的方法調用分配到委託對象上反射執行,配置執行過程中,開發人員還可以進行修改

代理設計模式

代理是一種常用的設計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問。代理類負責為委託類預處理消息、過濾消息並轉發消息,以及進行消息被委託類執行後的後續處理。

1.

為了保持行為的一致性,代理類和委託類通常會實現相同的介面

2.

引入代理能夠控制對委託對象的直接訪問,可以很好的隱藏和保護委託對象,也更加具有靈活性

相關的類和介面

要了解

Java

動態代理的機制,首先需要了解以下相關的類或介面:

1.

java.lang.reflect.Proxy:這是

Java

動態代理機制的主類,它提供了一組靜態方法來為一組介面動態地生成代理類及其對象

2.

java.lang.reflect.InvocationHandler:這是調用處理器介面,它自定義了一個invoke方法,用於幾種處理在動態代理類對象上的方法調用。通常在該方法中實現對委託類的代理訪問。

3.

java.lang.ClassLoader:Proxy

靜態方法生成動態代理類同樣需要通過類裝載器來進行裝載才能使用,它與普通類的唯一區別就是其位元組碼是由

JVM

在運行時動態生成的而非預存在於任何一個.class

文件中。

代理機制及其特點

首先讓我們來了解一下如何使用

Java

動態代理。具體有如下四步驟:

1.

通過實現

InvocationHandler

介面創建自己的調用處理器;

2.

通過為

Proxy

類指定

ClassLoader

對象和一組

interface

來創建動態代理類;

3.

通過反射機制獲得動態代理類的構造函數,其唯一參數類型是調用處理器介面類型;

4.

通過構造函數創建動態代理類實例,構造時調用處理器對象作為參數被傳入。

Java的動態代理中invoke方法是順序執行的嗎?我的怎麼這麼奇怪?

是這樣用的吧,我的一個代碼用來在方法前開啟事務和方法後關閉的,執行流程應該不會有問題的,你的問題很奇怪啊

用動態代理 在getlist的方法用動態代理包裝下,加入事務

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import org.hibernate.*

import com.strutslet.demo.service.SystemException;

public final class TransactionWrapper {

/**

* 裝飾原始的業務代表對象,返回一個與業務代表對象有相同介面的代理對象

*/

public static Object decorate(Object delegate) {

return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),

delegate.getClass().getInterfaces(), new XAWrapperHandler(

delegate));

}

//動態代理技術

static final class XAWrapperHandler implements InvocationHandler {

private final Object delegate;

XAWrapperHandler(Object delegate) {

this.delegate = delegate;

}

//簡單起見,包裝業務代表對象所有的業務方法

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

Object result = null;

session = SessionFactory.getSession();

try {

//開始一個事務

Transaction tx = session.beginTransaction();

//調用原始業務對象的業務方法

result = method.invoke(delegate, args);

session.flush();

tx.commit();

} catch (Throwable t) {

//回滾

ta.rollback();

throw new SystemException(t);

}

return result;

}

}

}

bo層事務就不用寫了直接寫個工廠,return

TransactionWrapper.decorate(new ColumnsDao())

java動態代理實現步驟?

您好,提問者:

1、可以使用apache開發的HttpClient.jar來實現。

2、如果純Java代碼,首先創建一個Proxy類來進行指定協議,比如:Proxy.HTTP,構造方法請見JDK API文檔,另外指定一個SocketAddress的ip和埠,一般http埠為80。

接下來就是訪問Http網站了,使用URL url = new URL(“xxx”);地址,然後使用HttpConnection對象,把Proxy指定進去就可以了。

原創文章,作者:ZKZP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143564.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZKZP的頭像ZKZP
上一篇 2024-10-22 23:34
下一篇 2024-10-22 23:34

相關推薦

  • QML 動態載入實踐

    探討 QML 框架下動態載入實現的方法和技巧。 一、實現動態載入的方法 QML 支持從 JavaScript 中動態指定需要載入的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • 三星內存條參數用法介紹

    本文將詳細解釋三星內存條上面的各種參數,讓你更好地了解內存條並選擇適合自己的一款。 一、容量大小 容量大小是內存條最基本的參數,一般以GB為單位表示,常見的有2GB、4GB、8GB…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python input參數變數用法介紹

    本文將從多個方面對Python input括弧里參數變數進行闡述與詳解,並提供相應的代碼示例。 一、基本介紹 Python input()函數用於獲取用戶輸入。當程序運行到inpu…

    編程 2025-04-29
  • Spring Boot中發GET請求參數的處理

    本文將詳細介紹如何在Spring Boot中處理GET請求參數,並給出完整的代碼示例。 一、Spring Boot的GET請求參數基礎 在Spring Boot中,處理GET請求參…

    編程 2025-04-29
  • Python如何判斷質數和異常處理

    本文主要介紹Python如何判斷質數和異常處理,其中包括多個方面的內容。 一、判斷質數 1、定義:質數是指除了1和它本身兩個因數外,沒有其他的因數。 2、判斷方法: (1)從2到n…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • Python Class括弧中的參數用法介紹

    本文將對Python中類的括弧中的參數進行詳細解析,以幫助初學者熟悉和掌握類的創建以及參數設置。 一、Class的基本定義 在Python中,通過使用關鍵字class來定義類。類包…

    編程 2025-04-29
  • Hibernate日誌列印sql參數

    本文將從多個方面介紹如何在Hibernate中列印SQL參數。Hibernate作為一種ORM框架,可以通過列印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29

發表回復

登錄後才能評論