디자인 모드 - 동적 에이전트

8029 단어 디자인 모드
1. 자바 동적 에이전트 류 는 자바. lang. reflect 패키지 에 위치 하고 보통 다음 과 같은 두 가지 종류 와 관련된다.
(1) Interface Invocation Handler: 이 인터페이스 에서 하나의 방법 만 정 의 했 습 니 다. Public object invoke (Object obj, Method method, Object [] args) 가 실제 사용 할 때 첫 번 째 매개 변 수 는 일반적으로 프 록 시 클래스 를 말 합 니 다. method 는 프 록 시 방법 입 니 다. 예 를 들 어 상기 request (), args 는 이 방법의 매개 변수 배열 입 니 다.이 추상 적 인 방법 은 대리 류 에서 동태 적 으로 실현 된다.
 
(2) Proxy: 이 종 류 는 동적 에이전트 클래스 로 상례 의 Proxy Subject 와 유사 한 역할 을 하 며 다음 과 같은 내용 을 포함한다.
protected Proxy (InvocationHandler h): 구조 함수 로 내부 의 h 에 값 을 부여 합 니 다.
static Class getProxyClass (ClassLoader loader, Class [] interfaces): 하나의 프 록 시 클래스 를 얻 었 습 니 다. 그 중에서 loader 는 클래스 로 더 이 고 interfaces 는 실제 클래스 가 가지 고 있 는 모든 인터페이스의 배열 입 니 다.
static Object newProxyInstance (ClassLoader loader, Class [] interfaces, InvocationHandler h): 프 록 시 클래스 의 인 스 턴 스 를 되 돌려 줍 니 다. 되 돌아 온 프 록 시 클래스 는 프 록 시 클래스 로 사용 할 수 있 습 니 다. (피 프 록 시 클래스 가 Subject 인터페이스 에서 설명 한 방법 을 사용 할 수 있 습 니 다)
 
Dynamic Proxy 란 이러한 class 입 니 다. 실행 할 때 생 성 된 class 입 니 다. 생 성 할 때 interface 를 제공 해 야 합 니 다. 그리고 이 class 는 이러한 interface 를 실현 했다 고 주장 합 니 다.너 는 당연히 이 class 의 인 스 턴 스 를 이 interface 의 어떤 것 으로 도 사용 할 수 있다.물론 이 Dynamic Proxy 는 프 록 시 입 니 다. 실질 적 인 작업 을 대신 하지 않 습 니 다. 인 스 턴 스 를 생 성 할 때 handler 를 제공 하여 실제 작업 을 인수 해 야 합 니 다.
 
동적 에이전트 만 들 기:
1. 인터페이스 Invocation Handler 를 실현 하 는 클래스 를 만 듭 니 다. invoke 방법 을 실현 해 야 합 니 다. 2. 프 록 시 클래스 와 인 터 페 이 스 를 만 듭 니 다. 3. 프 록 시의 정적 방법 인 new Proxy Instance (ClassLoader loader, Class [] interfaces, Invocation Handler h) 를 통 해 프 록 시 4 를 만 듭 니 다. 프 록 시 호출 방법 을 통 해
 
동적 에이전트 의 장점:
디 결합 을 편리 하 게 실현 할 수 있 습 니 다. AOP 밑 에 있 는 것 은 주로 자바 의 이 동적 대 리 를 통 해 이 루어 집 니 다.
 
예 를 들 어 동적 에이전트 설명:
1. 자바 프로젝트 만 들 기
2. 프 록 시 인터페이스 만 들 기
package com.proxy.dynamicProxy;



public interface Foo

{

    public int deleteUserById(int userId);

    

    public void findAllUser();

    

}

3. 프 록 시 인터페이스의 실현 클래스 만 들 기
package com.proxy.dynamicProxy;



public class FooImpl implements Foo

{



    @Override

    public int deleteUserById(int userId)

    {

        System.out.println("        ..");

        return 1;

    }



    @Override

    public void findAllUser()

    {

        System.out.println("          ..");

    }

}

4. InvocationHandler 구현 클래스 만 들 기
package com.proxy.dynamicProxy;



import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;





public class ComonInvocationHandler implements InvocationHandler

{

    private Object obj; //      

    

    public ComonInvocationHandler(){

        

    }

    public ComonInvocationHandler(Object target)

    {

        obj = target;

    }



    @Override

    //            ,           invoke  

    /**

     *     :

     * proxy:      

     * method:         

     * args:                

     */

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

            throws Throwable

    {

        System.out.println("before calling......");

        System.out.println("      : "+method.getName());

        Object result = method.invoke(obj, args);

        

        System.out.println("after calling.....");

        return result;

        

    }



}

5. 대상 을 지정 하기 위해 프 록 시 대상 을 만 드 는 클래스 만 들 기
package com.proxy.dynamicProxy;

import java.lang.reflect.Proxy;

/**

 *                   

 *  Proxy.newProxyInstance(loader, interfaces, h):             ,         

            interfaces       ,                     InvocationHandler   invoke  

 * loader -           

 * interfaces -            

 *               

 */

public class ProxyFactory

{

    public static Object getProxy(Object target)

    {

        Class<?> classType = target.getClass();

        ComonInvocationHandler handler = new ComonInvocationHandler(target);

        

        return Proxy.newProxyInstance(classType.getClassLoader(), 

                classType.getInterfaces(), handler);

    }

}

6. 테스트 클래스
package com.proxy.dynamicProxy;



public class Client

{

    public static void main(String[] args)

    {

       //  Foo     ,  target

       Foo foo = new FooImpl();

       

       //    target       

       Foo proxyFoo = (Foo) ProxyFactory.getProxy(foo);

       

       System.out.println("       : "+proxyFoo.deleteUserById(1));

       proxyFoo.findAllUser();

       

    }

}

좋은 웹페이지 즐겨찾기