103 동적 에이전트
1. 정적 에이전트
프록시 모드는 대상에게 프록시 대상을 제공하고 프록시 대상이 원래 대상에 대한 인용을 제어합니다.
좋은 점
대리 3대 역할
2. 동적 에이전트
실행할 때 프록시 클래스와 실례를 다시 만들기 때문에 효율이 훨씬 낮습니다.이 장면을 완성하려면 운행 기간에 클래스를 동적으로 만들어야 합니다.JDK가 Proxy를 제공해서 이 일을 완성했습니다.
//
interface Api {
void test(String a);
}
//
class ApiImpl{
@Override
public void test(String a) {
System.out.println(" :" + a);
} }
//
ApiImpl api = new ApiImpl();
//JDK :
Proxy.newProxyInstance(getClass().getClassLoader(),new Class[]{Api.class}, //JDK
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throwsThrowable {
//
return method.invoke(api, args); }
});
참고: Proxy.New Proxy Instance에서 클래스를 만들 것입니다. 정적 에이전트와 달리, 이 클래스는 구체적인 것이 아닙니다.자바 원본 파일은 실제 파일이 없고 메모리에 클래스 형식에 따라 클래스를 생성합니다.
public interface Api {
String getString();
}
String name = Api.class.getName()+"$Proxy0";
// Class
byte[] bytes = ProxyGenerator.generateProxyClass(name, new Class[]{Api.class});
FileOutputStream fos = new FileOutputStream("lib/" + name+".class");
fos.write(bytes);
fos.close();
// class
public final class Api$Proxy0 extends Proxy implements Api {
private static Method m1;
private static Method m2;
private static Method m0;
private static Method m3;
public Api$Proxy0(InvocationHandler var1) throws {
super(var1);
}
public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
public final String toString() throws {
try {
return (String)super.h.invoke(this, m2, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final int hashCode() throws {
try {
return (Integer)super.h.invoke(this, m0, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
public final String getString() throws {
try {
return (String)super.h.invoke(this, m3, (Object[])null);
} catch (RuntimeException | Error var2) {
throw var2;
} catch (Throwable var3) {
throw new UndeclaredThrowableException(var3);
}
}
static {
try {
m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
m2 = Class.forName("java.lang.Object").getMethod("toString");
m0 = Class.forName("java.lang.Object").getMethod("hashCode");
m3 = Class.forName("com.example.lib.Api").getMethod("getString");
} catch (NoSuchMethodException var2) {
throw new NoSuchMethodError(var2.getMessage());
} catch (ClassNotFoundException var3) {
throw new NoClassDefFoundError(var3.getMessage());
}
}
}
이곳의 h는 사실 InvocationHandler 인터페이스이기 때문에 우리가 동적 에이전트를 사용할 때 전달하는 InvocationHandler는 하나의 감청이고 대리 대상에서 실행하는 방법은 모두 이 감청에서 되돌아온다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.