Proxy 대리자 모드 (2)
1. JDK의 동적 에이전트는 하나의 인터페이스와 하나의 클래스가 있다
InvocationHandler 커넥터
package java.lang.reflect;
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
Proxy 클래스: Proxy 클래스는 프록시를 전문적으로 완성하는 조작 클래스로 한 개 이상의 인터페이스를 통해 실현 클래스를 동적으로 생성할 수 있으며 다음과 같은 조작 방법을 제공한다.
public static Object newProxyInstance(ClassLoader loader,
Class>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
{...}
2. JDK 동적 에이전트 구현
정적 프록시 클래스와 대조되는 것은 동적 프록시 클래스입니다. 동적 프록시 클래스의 바이트 코드는 프로그램이 실행될 때 자바 반사 메커니즘에 의해 동적으로 생성되며, 프로그램이 직접 원본 코드를 작성할 필요가 없습니다.동적 프록시 클래스는 프로그래밍 작업을 간소화할 뿐만 아니라 소프트웨어 시스템의 확장성을 향상시켰다. 왜냐하면 자바 반사 메커니즘은 임의의 유형의 동적 프록시 클래스를 생성할 수 있기 때문이다.java.lang.reflect 패키지의 Proxy 클래스와 InvocationHandler 인터페이스는 동적 프록시 클래스를 생성하는 능력을 제공합니다.
1. RunAble 인터페이스
우리는 RunAble의 모든 실현 클래스의Proxy를 생성하고 인터페이스를 먼저 정의하려고 합니다
package com.mmb.jdk;
public interface RunAble {
public void running();
}
2. RunAble의 프록시 클래스를 정의하는 RunAbleProxy
package com.mmb.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class RunAbleProxy implements InvocationHandler {
private Object target;
public Object bind(Object target)
{
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
// // ( ,cglib )
}
// invoke
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("$Proxy is ready to run.");
result = method.invoke(target,args);
System.out.println("$Proxy had done.");
return result;
}
}
3. RunAble 인터페이스의 실현 유형
package com.mmb.jdk;
public class Car implements RunAble {
@Override
public void running() {
System.out.println("Car is running");
}
}
package com.mmb.jdk;
public class Dog implements RunAble {
@Override
public void running() {
System.out.println("Dog is running");
}
}
4. 테스트 클래스 ProxyStudy
package com.mmb.jdk;
public class ProxyStudy
{
public static void main(String[] args) {
RunAbleProxy runAbleProxy = new RunAbleProxy();
RunAble runAble = (RunAble)runAbleProxy.bind(new Car());
runAble.running();
System.out.println("=============================================");
RunAble runAble1 = (RunAble)runAbleProxy.bind(new Dog());
runAble1.running();
}}
5. 결과
$Proxy is ready to run.
Car is running
$Proxy had done.
=============================================
$Proxy is ready to run.
Dog is running
$Proxy had done.
그러나 JDK의 동적 에이전트는 인터페이스에 의해 이루어진다. 만약에 일부 종류가 인터페이스를 실현하지 못하면 JDK 에이전트를 사용할 수 없다. 그러면 cglib 동적 에이전트를 사용해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.