먼저 동적 프록시 모델의 세 가지 역할을 분석합니다.
1. 추상 역할: 정적 프록시에서는 추상 클래스가 될 수 있지만 동적 프록시에서는 인터페이스만 될 수 있습니다.
2. 실제 역할: 추상 역할에서 메서드를 구현합니다.
3. 에이전트 역할: 가장 역겨운 것은 동적 에이전트에서의 에이전트 역할입니다. 실제 캐릭터에 대한 참조를 보유해야 합니다.
여기에는 인터페이스와 클래스, InvocationHandler 인터페이스와 Proxy 클래스가 포함됩니다. JDK 문서에 따르면 InvocationHandler 인터페이스는 클래스에 의해 구현되며 이 클래스의 인스턴스는 프록시 객체에 해당하는 핸들러 객체입니다. 프록시 객체의 메소드가 호출되면 해당 메소드가 인코딩되어 해당 핸들러 객체의 호출 메소드에 할당되어 호출됩니다!
다음과 같이 코드 코드를 복사합니다.
//추상 역할:
공개 인터페이스 AbstractRole
{
공공 무효 쇼();
}
//실제 문자:
공개 클래스 RealRole은 AbstractRole을 구현합니다.
{
@보수
public void show(){ System.out.println("집을 보여주세요") }
}
//에이전트 역할:
//이건 그냥 의사 에이전트인 것 같아요 = =! , 실제로는 에이전트에 해당하는 핸들러이기 때문입니다.
공용 클래스 핸들러는 InvocationHandler를 구현합니다.
{
private Object realRole; // 프록시 역할은 실제 역할에 대한 참조가 필요합니다. 객체 유형으로 정의된 경우 범용입니다.
공용 핸들러(객체 realRole)
{ this.realRole = 실제Role }
@보수
공용 객체 호출(객체 프록시, 메소드 메소드, Object[] args)
{
System.out.println("Give me your Money"); // 상담원 역할 자체에 의해 추가되는 추가 기능입니다.
method.invoke(this.realRole, args); //리플렉션을 통해 실제 역할의 메소드를 호출합니다.
System.out.println("알겠습니다...집은 당신 것입니다");//이것은 상담원 역할 자체에 의해 추가된 추가 기능입니다.
}
public Object Factory()//팩토리 메소드를 통해 실제 에이전트 역할 생성
{
return Proxy.newProxyInstance(this.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(), this); //프록시의 newProxyInstance 메소드에는 두 가지 매우 중요한 기능이 있습니다! 첫 번째는 프록시 클래스를 동적으로 생성하는 것입니다. 출력이 $Proxy0이라는 클래스인 경우 두 번째는 동적으로 생성된 클래스를 통해 인스턴스를 생성하는 것입니다.
}
}
//고객:
공개 수업 테스트
{
공개 정적 무효 메인(문자열[] 인수)
{
RealRole realRole = new RealRole();//어떤 실제 역할을 대표하고 싶은지, 새로운 실제 역할을 생성하세요.
Handler handler = new Handler(realRole);//프록시 클래스에 해당하는 핸들러가 여기에서 생성됩니다. 또한 이를 의사 프록시 개체라고 부르고 싶습니다.
AbstractRole 프록시 = (AbstractRole)handler.factory();//팩토리 메소드를 통해 프록시 객체 생성
}
}
여기서 상담원 역할이 어떻게 강제로 추상 역할로 변환될 수 있는지 궁금하실 것입니다. 그 이유는 newProxyInstance 메소드에 있습니다. 위에서 언급한 것처럼 이 메소드는 자동으로 클래스를 생성한 다음 해당 클래스를 통해 프록시 객체를 생성합니다. 실제로 이 클래스는 추상 역할 클래스를 구현합니다. 두 번째 매개변수는 이미 구현하는 인터페이스를 지정했기 때문입니다. 따라서 강제 전송 후 추상 역할에서 메서드를 호출할 수 있습니다.
Proxy.show();//좋아요! 이 문장에 주의하세요. "이 메소드는 인코딩되어 호출할 해당 핸들러 객체의 호출 메소드에 할당됩니다!"라고 빨간색으로 표시했습니다. 물론, show 메소드의 매개변수도 따르지만 여기서 show 메소드에는 매개변수가 없습니다. 따라서 Proxy.show() 문장은 실제로 핸들러 객체의 호출 메서드를 호출합니다.