프로그램이 실행되기 전에 프록시 클래스가 이미 존재하는 경우이 프록시 방법을 정적 프록시라고합니다. 이 경우 프록시 클래스는 일반적으로 Java 코드로 정의됩니다. 일반적으로 정적 프록시의 프록시 클래스 및 대의원 클래스는 동일한 인터페이스를 구현하거나 동일한 상위 클래스에서 파생됩니다.
1. 개요
1. 에이전트 가란 무엇입니까?
우리는 WeChat 에이전트가 단순히 제조업체를 대신하여 상품을 판매하고 있으며 제조업체는 상품을 판매하기 위해 "위탁"에이전트를 판매합니다. WeChat 비즈니스 에이전트와 관련하여, 우선, 우리가 물건을 구매할 때, 우리는 일반적으로 제조업체가 누구인지, 즉“위원”이 우리에게 보이지 않습니다. 둘째, WeChat 비즈니스 에이전트는 주로 친구의 직원을 고객으로 대상으로하며, 이는 제조업체의 고객 그룹의 "필터"와 동일합니다. 우리는 마이크로 비즈니스 에이전트와 제조업체를 더 추상화합니다. 전자는 에이전트 클래스로 추상화 될 수 있으며, 후자는 대의원 클래스 (에이전트 클래스)로 추상화 될 수 있습니다. 프록시를 사용하면 일반적으로 두 가지 장점이 있으며 우리가 언급 한 마이크로 비즈니스 에이전트의 두 가지 특성에 해당 할 수 있습니다.
Advantage 1 : 대의원 클래스의 구현을 숨길 수 있습니다.
Advantage 2 : 클라이언트와 대의원 클래스 간의 분리를 달성 할 수 있으며 대의원 클래스 코드를 수정하지 않고 추가 처리를 수행 할 수 있습니다.
2. 정적 프록시
프로그램이 실행되기 전에 프록시 클래스가 이미 존재하는 경우이 프록시 방법을 정적 프록시라고합니다. 이 경우 프록시 클래스는 일반적으로 Java 코드로 정의됩니다. 일반적으로 정적 프록시의 프록시 클래스 및 대의원 클래스는 동일한 인터페이스를 구현하거나 동일한 상위 클래스에서 파생됩니다. 아래에서 우리는 공급 업체 클래스를 사용하여 제조업체와 BusinessAgent 클래스를 대표하여 Micro-Business 에이전트를 대표하여 정적 에이전트의 간단한 구현을 소개합니다. 대표단 클래스와 프록시 클래스는 판매 인터페이스를 구현합니다. 판매 인터페이스의 정의는 다음과 같습니다.
Public Interface Sell {void sell (); void ad (); } 공급 업체 클래스의 정의는 다음과 같습니다. 공개 클래스 공급 업체는 판매 {public void sell () {System.out.println ( "Sell Method"); } public void ad () {system, out.println ( "ad method")}} 프록시 클래스 비즈니스 에이전트의 정의는 다음과 같습니다.
공개 클래스 공급 업체는 판매 {public void sell () {System.out.println ( "In Sell Method"); } public void ad () {system, out.println ( "ad method")}} BusinessAgent 클래스의 정의에서 우리는 에이전트 클래스가 대의원 클래스에 대한 참조를 보유 할 수 있도록 정적 에이전트를 집계를 통해 구현할 수 있음을 이해할 수 있습니다.
아래 에서이 요구 사항을 고려해 봅시다. 공급 업체 수업에 필터링 기능을 추가하고 대학생에게만 상품을 판매하십시오. 정적 프록시를 통해 공급 업체 클래스의 코드를 수정하지 않고도 달성 할 수 있습니다. 우리는 BusinessAgent 클래스의 판매 방법에 판단을 추가하면 다음과 같습니다.
공개 클래스 비즈니스 에이전트 도구 판매 {... public void sell () {if (iscollegestudent ()) {vendor.sell (); }} ...} 이는 위에서 언급 한 프록시를 사용하는 두 번째 이점에 해당합니다. 클라이언트와 대의원 클래스 간의 분리를 달성 할 수 있으며 대의원 클래스 코드를 수정하지 않고 추가 처리를 수행 할 수 있습니다. 정적 프록시의 한계는 실행하기 전에 프록시 클래스를 작성해야한다는 것입니다. 런타임에서 프록시 클래스를 생성하는 동적 프록시 방법을 소개하는 데 중점을 두겠습니다.
2. 동적 에이전트
1. 동적 대리인이란 무엇입니까?
프로그램이 실행될 때 프록시 클래스에서 생성 된 프록시 방법을 동적 프록시라고합니다. 즉,이 경우 프록시 클래스는 Java 코드에서 정의되지 않지만 Java 코드의 "명령어"를 기반으로 런타임에 동적으로 생성됩니다. 정적 프록시와 비교하여 동적 프록시의 장점은 각 프록시 클래스의 기능을 수정하지 않고 프록시 클래스의 함수를 쉽게 처리 할 수 있다는 것입니다. 이것은 더 추상적입니다. 동적 프록시의 장점이 어떻게 반영되는지 소개하기 위해 예제를 결합하겠습니다.
이제 요구 사항을 구현한다고 가정 해 봅시다. 대의원 클래스에서 메소드를 실행하기 전에 "이전"출력 및 실행 후 "출력"을 구현한다고 가정 해 봅시다. 위의 예제에서 공급 업체 클래스를 대의원 클래스로 소개하고 BusinessAgent 클래스를 프록시 클래스로 소개합니다. 먼저 정적 프록시를 사용 하여이 요구 사항을 달성합시다. 관련 코드는 다음과 같습니다.
공개 클래스 비즈니스 에이전트 도구 판매 {개인 공급 업체 MVendor; Public BusinessAgent (공급 업체 공급 업체) {this.mvendor = 공급 업체; } public void sell () {System.out.println ( "이전"); mvendor.sell (); System.out.println ( "After"); } public void ad () {system.out.println ( "이전"); mvendor.ad (); System.out.println ( "After"); }} 위의 코드에서 정적 프록시를 통해 요구를 구현하려면 각 방법에 해당 논리를 추가해야한다는 것을 이해할 수 있습니다. 여기에는 두 가지 방법이 있으므로 워크로드가 크지 않습니다. 판매 인터페이스에 수백 가지 방법이 포함되어 있으면 어떻게됩니까? 현재 정적 프록시를 사용하면 많은 중복 코드가 작성됩니다. 동적 프록시를 사용하면 각 방법을 하나씩 수정하지 않고 모든 프록시 클래스의 메소드를 균일하게 처리하기 위해 "균일 한 표시"를 만들 수 있습니다. 동적 프록시를 사용하여 요구를 구현하는 방법을 소개해 봅시다.
2. 동적 프록시를 사용하십시오
(1) InvocationHandler 인터페이스에서 동적 프록시를 사용할 때 프록시 클래스와 대의원 클래스 사이에 위치한 중개 클래스를 정의해야합니다. 이 중개 클래스는 InvocationHandler 인터페이스를 구현해야합니다. 이 인터페이스의 정의는 다음과 같습니다.
public interface invociation hant }
invocationHandler라는 이름 에서이 인터페이스를 구현하는 중재 클래스가 "통화 프로세서"로 사용됨을 알 수 있습니다. 프록시 클래스 객체의 메소드를 호출하면이 "호출"은 호출 메소드로 전달됩니다. 프록시 클래스 객체는 프록시 매개 변수로 전달됩니다. 매개 변수 메소드는 프록시 클래스를 호출하는 메소드를 식별합니다. Args는이 방법의 매개 변수입니다. 이러한 방식으로 프록시 클래스의 모든 메소드에 대한 호출은 호출 호출이되므로 통합 처리 로직을 호출 메소드에 추가 할 수 있습니다 (또는 메소드 매개 변수에 따라 프록시 클래스의 다른 메소드를 처리 할 수 있음). 따라서 중재 클래스의 호출 메소드 구현에서 "이전"만 출력 한 다음 대의원 클래스의 호출 방법을 호출 한 다음 "후"를 출력하면됩니다. 단계별로 구현합시다.
(2) 동적 대리인 클래스의 동적 프록시 방법에 따라 대의원 클래스는 특정 인터페이스를 구현해야합니다. 여기서 우리는 판매 인터페이스를 구현합니다. 공급 업체 클래스의 정의는 다음과 같습니다.
공개 클래스 공급 업체는 판매 {public void sell () {System.out.println ( "In Sell Method"); } public void ad () {system, out.println ( "ad method")}} (3) 중재 클래스 위에서 언급 한 바와 같이, 중재 클래스는 호출 프로세서 "인터셉트"가 프록시 클래스 메소드에 대한 호출에 따라 invocationhandler 인터페이스를 구현해야합니다. 중개 클래스의 정의는 다음과 같습니다.
공개 클래스 DynamicProxy는 invocationHandler {private object obj; // obj는 대의원 클래스 객체입니다. Public DynamicProxy (Object obj) {this.obj = obj; } @override public object invoke (오브젝트 프록시, 메소드 메소드, 개체 [] args) 던질 가능 {system.out.println ( "prever"); 객체 결과 = method.invoke (obj, args); System.out.println ( "After"); 반환 결과; }} 위의 코드에서, 중개 클래스가 대의원 객체 참조를 보유하고 있으며, 대의원 객체의 해당 메소드가 호출 메소드 (11 행)에서 호출된다는 것을 알 수 있습니다. 이것을 볼 때 익숙해 보인다고 생각하십니까? 집계 방법을 통해 대의원 객체 참조를 보유하고 궁극적으로 모든 외부 호출을 변환하여 대의원 객체로 호출로 호출합니다. 위에서 소개 한 정적 프록시의 구현 방법이 아닙니까? 실제로, 중개 클래스와 대의원 클래스는 정적 프록시 관계를 형성합니다. 이 관계에서, 중개 클래스는 대리 클래스이며, 대의원 클래스는 대표 클래스입니다. 프록시 클래스와 중개 클래스는 또한 정적 프록시 관계를 형성합니다. 이 관계에서, 중개 클래스는 대표단 클래스이고 프록시 클래스는 프록시 클래스입니다. 다시 말해, 동적 프록시 관계는 두 가지 정적 프록시 관계로 구성되며, 이는 동적 프록시의 원칙입니다. 프록시 클래스를 동적으로 생성하는 방법을 소개해 봅시다.
(4) 동적 생성 프록시 클래스 동적 생성 프록시 클래스 관련 코드는 다음과 같습니다.
public class main {public static void main (String [] args) {// 중재 클래스의 인스턴스 생성 DynamicProxy inter = new DynamicProxy (new vendor ()); //이 문장을 추가하면 동적으로 생성 된 프록시 클래스 파일 시스템 인 $ proxy0.class 파일이 생성됩니다. // 프록시 클래스 인스턴스 판매 sell sell = (sell) (proxy.newproxyInstance (sell.class.getClassLoader (), new Class [] {sell.class}, inter)); // 프록시 클래스 객체를 통해 프록시 클래스 메소드를 호출하면 실제로 호출 메소드로 이동합니다. sell.ad (); }} 위의 코드에서는 프록시 클래스 인스턴스를 얻기 위해 프록시 클래스의 NewProxyInstance 메소드를 호출합니다. 이 프록시 클래스는 우리가 지정한 인터페이스를 구현하고 지정된 통화 프로세서에 메소드 호출을 배포합니다. 이 방법의 선언은 다음과 같습니다.
코드를 다음과 같이 복사하십시오. public static 객체 NewProxyInstance (클래스 로더 로더, 클래스 <?> [] 인터페이스, invocationHandler h)는 불법 행위 예고로 던져집니다.
이 방법의 세 가지 매개 변수는 다음과 같습니다.
로더 : 프록시 클래스의 클래스더러를 정의합니다.
인터페이스 : 프록시 클래스에서 구현 한 인터페이스 목록
H : 프로세서를 호출하십시오. 즉, 위에서 정의한 클래스 인스턴스는 invocationHandler 인터페이스를 구현하고 동적 프록시가 제대로 작동 할 수 있는지 확인해 보겠습니다. 내가 여기에서 실행하는 출력은 다음과 같습니다.
이것은 우리의 역동적 인 프록시가 실제로 작동하고 있음을 보여줍니다.
우리는 위의 역동적 인 프록시의 원리를 간단히 언급했습니다. 여기서 간단히 요약 할 것입니다. 먼저 NewProxyInstance 메소드를 통해 프록시 클래스 인스턴스를 얻은 다음이 프록시 클래스 인스턴스를 통해 프록시 클래스 메소드를 호출 할 수 있습니다. 프록시 클래스 방법에서는 실제로 중재 클래스의 호출 방법 (프로세서라고 함)을 호출합니다. Invoke 메소드에서는 대의원 클래스의 해당 메소드를 호출하고 자체 처리 로직을 추가 할 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.