Java Dynamic Proxy 클래스는 java.lang.reflect 패키지 아래에 있으며 일반적으로 다음 두 클래스가 포함됩니다.
(1) InvocationHandler :이 인터페이스에서는 하나의 메소드 만 정의됩니다.
공개 객체 호출 (Object OBJ, Method Method, Object [] args)
실제로 사용하면 첫 번째 매개 변수 OBJ는 일반적으로 프록시 클래스를 지칭하며, 메소드는 위 프록시 메소드 (예 : request)와 같은 프록시 메소드입니다. 위의 예에서 Args는 메소드의 매개 변수 배열입니다. 이 추상 방법은 프록시 클래스에서 동적으로 구현됩니다.
(2) 프록시 :이 클래스는 동적 프록시 클래스이며, 그 기능은 위의 예에서 proxysubject와 유사하며, 주로 다음 내용 보호 프록시 (invocationHandler h)를 포함합니다. 생성자, 값을 내부 H.
정적 클래스 getProxyClass (클래스 로더 로더, 클래스 [] 인터페이스)
로더가 클래스 로더 인 프록시 클래스를 받고 인터페이스는 실제 클래스가 소유 한 모든 인터페이스의 배열입니다.
정적 객체 NewProxyInstance (클래스 로더 로더, 클래스 [] 인터페이스, invocationHandler h)
리턴 클래스의 인스턴스는 프록시 클래스로 사용할 수 있습니다 (프록시 클래스의 제목 인터페이스에서 선언 된 메소드는 사용될 수 있습니다).
소위 다이내믹 프록시는 클래스입니다. 런타임에 생성 된 클래스는 인터페이스 세트를 제공해야하며 클래스는 이러한 인터페이스를 구현한다고 주장합니다. 물론 클래스 인스턴스를 이러한 인터페이스로 사용할 수 있습니다. 물론,이 동적 프록시는 실제로 대리인으로, 인스턴스를 생성 할 때는 핸들러를 제공해야하며 실제 작업을 인수해야합니다.
동적 프록시 클래스를 사용하는 경우 invocationhandler 인터페이스를 구현해야합니다.
프로그램 주제를 참조하십시오
프로그램 realSubject.java 프로그램을 참조하십시오
프로그램 DynamicSubject.java를 참조하십시오
프로그램 client.java를 참조하십시오
코드 사본은 다음과 같습니다.
패키지 com.langsin.dynamicproxy;
// 초록 역할 (이전에는 추상 클래스였으며 여기에서 인터페이스로 변경해야합니다) :
공개 인터페이스 주제
{
추상 공개 공허 요청 ();
}
코드 사본은 다음과 같습니다.
패키지 com.langsin.dynamicproxy;
// 특정 역할
공개 클래스 RealSubject 주제를 구현합니다
{
public realsubject ()
{
}
공개 무효 요청 ()
{
System.out.println ( "실제 주제로부터");
}
}
코드 사본은 다음과 같습니다.
패키지 com.langsin.dynamicproxy;
import java.lang.reflect.invocationHandler;
import java.lang.reflect.method;
// 프록시 프로세서
/**
* 프록시 클래스의 내부 속성은 객체 클래스입니다.
* 또한 호출 방법은이 클래스에서도 구현됩니다. Method.invoke (sub, args);
* 실제로 메소드 파라미터 서브에 의해 실행되는 메소드를 호출하는 것이 실제 프록시 객체입니다.
* Args는 프록시 오브젝트의 해당 작업을 수행하는 데 필요한 매개 변수입니다.
* 동적 프록시 클래스를 통해 통화 전후에 관련 작업을 수행 할 수 있습니다.
*/
공개 클래스 DynamicsUbject는 invocationHandler를 구현합니다
{
개인 객체 서브;
public dynamicsubject ()
{
}
Public DynamicsUbject (Object OBJ)
{
sub = obj;
}
공개 객체 호출 (객체 프록시, 메소드 메소드, 개체 [] args) 던지기 가능
{
System.out.println ( "호출 전" + 메소드);
Method.invoke (sub, args);
System.out.println ( "호출 후" + 메소드);
널 리턴;
}
}
코드 사본은 다음과 같습니다.
패키지 com.langsin.dynamicproxy;
import java.lang.reflect.invocationHandler;
java.lang.reflect.proxy import;
//고객
공개 클래스 클라이언트
{
정적 공개 공허 메인 (String [] args)은 던질 수 있습니다
{
realSubject rs = new RealSubject ();
invocationHandler ds = new DynamicSubject (RS);
클래스 <?> cls = rs.getClass ();
// 다음은 일회성 세대 에이전트입니다
대상 과목 = (주제) proxy.newproxyinstance (
cls.getclassloader (), cls.getInterfaces (), ds);
대상 .request ();
}
}
Example 2:
코드 사본은 다음과 같습니다.
패키지 com.langsin.dynamicproxy;
import java.lang.reflect.invocationHandler;
import java.lang.reflect.method;
java.lang.reflect.proxy import;
Java.util.list 가져 오기;
import java.util.vector;
공개 클래스 vectorproxy는 호출 핸들러를 구현합니다
{
개인 물체 proxyobj;
public vectorproxy (Object obj) {
proxyobj = obj;
}
공개 정적 물체 공장 (Object OBJ) {
클래스 <?> cls = obj.getClass ();
return proxy.newproxyInstance (cls.getClassLoader (), cls.getInterfaces (), new vectorProxy (OBJ));
}
공개 객체 호출 (객체 프록시, 메소드 메소드, Object [] args) 던지기 가능 {
System.out.println ( "호출 전" + 메소드);
if (args! = null) {
for (int i = 0; i <args.length; i ++) {
System.out.println (args [i] + "");
}
}
Object 객체 = method.invoke (proxyobj, args);
System.out.println ( "호출 후" + 메소드);
리턴 객체;
}
@suppresswarnings ( "확인되지 않은")
public static void main (String [] args) {
list <string> v = (list <string>) factory (new vector <string> (10));
v.add ( "new");
v.add ( "요크");
System.out.println (V);
v.remove (0);
System.out.println (V);
}
}
예 3.
코드 사본은 다음과 같습니다.
패키지 com.langsin.dynamicproxy;
공개 인터페이스 foo {
void doaction ();
}
패키지 com.langsin.dynamicproxy;
공개 클래스 fooimpl은 foo {
public fooimpl () {
}
public void doaction () {
System.out.println ( "fooimp1.doaction ()");
}
}
패키지 com.langsin.dynamicproxy;
공개 클래스 fooimpl2는 foo {
public fooimpl2 () {
}
public void doaction () {
System.out.println ( "fooimp2.doaction ()");
}
}
패키지 com.langsin.dynamicproxy;
import java.lang.reflect.invocationHandler;
import java.lang.reflect.method;
공개 클래스 CommonInvocationHandler는 invocationHandler {
// 콜백이 필요한 객체, 객체의 동적 실행
개인 객체 목표;
// 생성자 주입 지원
public commonInvocationHandler () {
}
// 생성자 주입 지원
public commonInvocationHandler (객체 대상) {
Settarget (대상);
}
/**
*
* Setter 메소드를 사용하여 주입하십시오
*
* @param 대상
*
*/
공개 void settarget (객체 대상) {
this.target = 대상;
}
/**
*
* 프록시에 지정된 메소드를 호출하고 매개 변수 목록에 전달됩니다.
*
* @param 프록시
* 메소드에 해당하는 프록시 인터페이스 정의와 같은 프록시 클래스의 유형
*
* @param 방법
* 근접한 방법
*
* @param args
* 프록시 방법을 호출하는 매개 변수
*
* @반품
*
* @throws java.lang.throwable
*
*/
공개 객체 호출 (객체 프록시, 메소드 메소드, Object [] args) 던지기 가능 {
return method.invoke (target, args);
}
}
패키지 com.langsin.dynamicproxy;
java.lang.reflect.proxy import;
공개 클래스 데모 {
public static void main (String [] args) {
// 1. 일반 동적 프록시 구현
commonInvocationHandler handler = new CommentInvocationHandler ();
foo f;
// 2. 인터페이스 구현 1
handler.settarget (new fooimpl ());
// 메소드 매개 변수 설명 : 프록시 클래스, 프록시 클래스 구현 목록, 프록시 클래스 프로세서
// 프록시 클래스에서 프록시 클래스, 인터페이스 메소드 및 프로세서를 연결하면 프록시 클래스의 인터페이스 메소드가 호출되면 프로세서의 호출 메소드에 자동으로 배포됩니다.
// 프록시 클래스가 지정된 인터페이스 목록을 구현하지 않으면 불법 매개 변수 예외가 발생합니다.
f = (foo) proxy.newproxyinstance (foo.class.getclassloader (),
새로운 클래스 [] {foo.class},
매니저);
f.Doaction ();
// 3. 인터페이스 구현 2
handler.settarget (new fooimpl2 ());
f = (foo) proxy.newproxyinstance (foo.class.getclassloader (),
새로운 클래스 [] {foo.class},
매니저);
f.Doaction ();
}
}
나는 문학적 재능이 제한되어 있기 때문에 대부분의 내용은 코드입니다