자바 동적 에이전트 (1)

8962 단어 자바
1. Public interface Invocation Handler Invocation Handler 는 프 록 시 인 스 턴 스 호출 처리 프로그램 이 실현 하 는 인터페이스 입 니 다.모든 프 록 시 인 스 턴 스 는 관련 호출 처리 프로그램 을 가지 고 있 습 니 다.프 록 시 인 스 턴 스 호출 방법 을 호출 할 때 방법 을 인 코딩 하고 호출 처리 프로그램의 invoke 방법 으로 할당 합 니 다.2. Object invoke (Object proxy, Method method, Object [] args) throws Throwable 은 프 록 시 인 스 턴 스 에서 처리 방법 을 호출 하고 결 과 를 되 돌려 줍 니 다.방법 과 연 결 된 프 록 시 인 스 턴 스 에서 방법 을 호출 할 때 호출 처리 프로그램 에서 이 방법 을 호출 합 니 다.인자: proxy - 그 위 에서 호출 하 는 방법의 프 록 시 실례 method - 프 록 시 실례 에서 호출 하 는 인터페이스 방법 에 대응 하 는 Method 실례.Method 대상 의 성명 류 는 그 중에서 성명 방법의 인터페이스 가 될 것 입 니 다. 이 인 터 페 이 스 는 대리 류 가 계승 방법 을 사용 하 는 대리 인터페이스의 초 인터페이스 일 수 있 습 니 다.args - 프 록 시 인 스 턴 스 에 호출 되 는 매개 변수 값 을 포함 하 는 대상 배열 입 니 다. 인터페이스 방법 이 인 자 를 사용 하지 않 으 면 null 입 니 다.기본 유형의 매개 변 수 는 적당 한 기본 포장 기 류 (예 를 들 어 자바. lang. Integer 또는 자바. lang. boolean) 의 인 스 턴 스 에 포 장 됩 니 다.반환: 프 록 시 인 스 턴 스 방법 에서 되 돌아 오 는 값 을 호출 합 니 다.인터페이스 방법의 성명 반환 유형 이 기본 유형 이 라면 이 방법 이 반환 하 는 값 은 반드시 해당 하 는 기본 포장 대상 류 의 인 스 턴 스 입 니 다.그렇지 않 으 면 성명 반환 형식 에 할당 할 수 있 는 형식 일 것 입 니 다.이 방법 이 되 돌아 오 는 값 이 null 이 고 인터페이스 방법의 되 돌아 오 는 형식 이 기본 형식 이 라면 프 록 시 인 스 턴 스 의 방법 호출 은 NullPointer Exception 을 던 집 니 다.그렇지 않 으 면 이 방법 이 상기 인터페이스 방법의 성명 반환 형식 과 호 환 되 지 않 으 면 프 록 시 인 스 턴 스 의 방법 호출 은 ClassCastException 을 던 집 니 다.던 지기: Throwable - 프 록 시 실례 에서 던 진 이상 을 호출 합 니 다.이 이상 한 유형 은 인터페이스 방법의 throws 자구 에 설 명 된 이상 유형 이나 검사 되 지 않 은 이상 유형 자바. lang. Runtime Exception 또는 자바. lang. Error 에 할당 할 수 있어 야 합 니 다.이 방법 이 검 사 를 거 친 이상 을 던 지면 인터페이스 방법의 throws 자구 에 할당 할 수 없 는 이상 유형 입 니 다. 프 록 시 인 스 턴 스 방법 호출 은 이 방법 이 던 진 이상 한 Undeclared Throwable Exception 을 던 집 니 다.
3.public class Proxy extends Object implements Serializable Proxy 동적 프 록 시 클래스 와 인 스 턴 스 를 만 드 는 정적 방법 을 제공 합 니 다. 이 방법 으로 만 든 모든 동적 프 록 시 클래스 의 초 클래스 입 니 다.
인터페이스 Foo 의 프 록 시 만 들 기:
     InvocationHandler handler = new MyInvocationHandler(...);
     Class proxyClass = Proxy.getProxyClass(
         Foo.class.getClassLoader(), new Class[] { Foo.class });
     Foo f = (Foo) proxyClass.
         getConstructor(new Class[] { InvocationHandler.class }).
         newInstance(new Object[] { handler });
 



또는 다음 과 같은 더 간단 한 방법 을 사용한다.
     Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                          new Class[] { Foo.class },
                                          handler);
 



동적 프 록 시 클래스 (이하 프 록 시 클래스 로 약칭) 는 클래스 를 만 들 때 실행 할 때 지정 한 인터페이스 목록 을 실현 하 는 클래스 로 다음 과 같은 행동 을 합 니 다.프 록 시 인 터 페 이 스 는 프 록 시 클래스 가 실현 하 는 인터페이스 이다.프 록 시 인 스 턴 스 는 프 록 시 클래스 의 인 스 턴 스 입 니 다.모든 프 록 시 인 스 턴 스 는 인터페이스 InvocationHandler 를 실현 할 수 있 는 관련 호출 처리 프로그램 대상 이 있 습 니 다.그 중의 프 록 시 인터페이스의 프 록 시 인 스 턴 스 방법 을 통 해 인 스 턴 스 호출 처리 프로그램 Invoke 방법 을 호출 하고 프 록 시 인 스 턴 스, 호출 방법 을 식별 하 는 java.lang.reflect.Method 대상 과 파 라 메 터 를 포함 하 는 Object 유형의 배열 을 전달 합 니 다.호출 처리 프로그램 은 인 코딩 을 적당 한 방식 으로 처리 하고 되 돌아 오 는 결 과 는 프 록 시 인 스 턴 스 방법 으로 호출 된 결 과 를 되 돌려 줍 니 다.
프 록 시 클래스 는 다음 속성 을 사용 합 니 다:
  • 대리 류 는 추상 적 인 것 이 아니 라 공공 적 이 고 최종 적 인 것 이다.
  • 대리 류 의 비 한정 명칭 을 지정 하지 않 았 습 니 다.단, 문자열 "$Proxy" 로 시작 하 는 클래스 이름 공간 은 프 록 시 클래스 로 유지 해 야 합 니 다.
  • 프 록 시 클래스 확장 java.lang.reflect.Proxy.
  • 프 록 시 클래스 는 생 성 할 때 지정 한 인 터 페 이 스 를 같은 순서 로 정확하게 실현 합 니 다.
  • 프 록 시 클래스 가 비 공공 인 터 페 이 스 를 실현 하면 이 인터페이스 와 같은 가방 에서 정 의 됩 니 다.그렇지 않 으 면 대리 류 의 가방 도 지정 되 지 않 았 습 니 다.가방 밀봉 은 프 록 시 클래스 가 실 행 될 때 특정 가방 에서 의 성공 적 인 정 의 를 막 지 않 고 같은 종류의 로 더 와 특정한 서명 을 가 진 가방 이 정의 하 는 클래스 를 막 지 않 습 니 다.
  • 프 록 시 클래스 는 생 성 할 때 지정 한 모든 인 터 페 이 스 를 실현 하기 때문에 Class 대상 호출 getInterfaces 은 같은 인터페이스 목록 을 포함 하 는 배열 (생 성 할 때 지정 한 순서) 을 되 돌려 주 고 Class 대상 호출 getMethods 은 이 인터페이스 에 있 는 모든 방법 을 포함 하 는 Method 대상 의 배열 을 되 돌려 줍 니 다.또한 호출 getMethod 은 프 록 시 인터페이스 에서 원 하 는 방법 을 찾 을 수 있 습 니 다.
  • 만약 Proxy.isProxyClass 방법 으로 대리 류 Proxy.getProxyClass 에서 돌아 오 는 클래스 또는 Proxy.newProxyInstance 에서 돌아 오 는 대상 의 클래스 를 전달 하면 이 방법 은 true 로 돌아 가 고 그렇지 않 으 면 false 로 돌아간다.
  • 프 록 시 클래스 java.security.ProtectionDomain 는 유도 클래스 로 더 (예 를 들 어 java.lang.Object 가 불 러 온 시스템 클래스 와 같 습 니 다. 프 록 시 클래스 의 코드 가 신뢰 받 는 시스템 코드 로 생 성 되 기 때 문 입 니 다.이 보호 구역 은 보통 java.security.AllPermission 수 여 됩 니 다.
  • 모든 프 록 시 클래스 는 하나의 매개 변수 (인터페이스 InvocationHandler 를 가 져 갈 수 있 는 공공 구조 방법 을 가지 고 프 록 시 인 스 턴 스 호출 처리 프로그램 을 설정 합 니 다.반사 API 를 사용 해 야 공공 구조 방법 에 접근 할 수 있 는 것 이 아니 라 호출 Proxy.newInstance 방법 (호출 Proxy.getProxyClass 의 조작 과 호출 처리 프로그램 이 있 는 구조 방법 을 결합) 을 통 해 프 록 시 인 스 턴 스 를 만 들 수 있 습 니 다.

  • 프 록 시 인 스 턴 스 는 다음 과 같은 속성 을 가지 고 있 습 니 다:
  • 프 록 시 인 스 턴 스 proxy 와 프 록 시 클래스 Foo 로 이 루어 진 인 터 페 이 스 를 제공 합 니 다. 다음 표현 식 은 true
         proxy instanceof Foo
    
    
    
     
    
    
    
    를 되 돌려 주 고 아래 의 강제 변환 작업 이 성공 합 니 다 ClassCastException:
         (Foo) proxy
    
    
    
     
    
    
    
  • 모든 프 록 시 인 스 턴 스 는 관련 된 호출 처리 프로그램 이 있 고 구조 방법 에 전 달 됩 니 다.정적 Proxy.getInvocationHandler 방법 은 매개 변수 로 전 달 된 프 록 시 인 스 턴 스 와 관련 된 호출 처리 프로그램 을 되 돌려 줍 니 다.
  • 프 록 시 인 스 턴 스 의 인터페이스 방법 호출 은 이 방법의 문서 설명 에 따라 인 코딩 을 하고 호출 처리 프로그램 Invoke 방법 으로 할당 된다.
  • 에이전트 인 스 턴 스 java.lang.Object 에서 밝 힌 hashCode, equals 또는 toString 방법의 호출 은 인 코딩 과 할당 인터페이스 방법 과 같은 방식 으로 인 코딩 되 고 호출 처리 프로그램 invoke 방법 으로 지 시 됩 니 다. 상기 와 같 습 니 다.invoke 에 전 달 된 Method 대상 의 성명 류 는 java.lang.Object 이다.대리 류 는 java.lang.Object 에서 계 승 된 대리 실례 의 다른 공공 방법 을 다시 쓰 지 않 기 때문에 이러한 방법의 호출 행 위 는 java.lang.Object 실례 에 대한 조작 과 같다.

  • 다 중 에이전트 인터페이스 에서 반복 되 는 방법
    프 록 시 클래스 의 두 개 이상 의 인터페이스 가 같은 이름과 매개 변수 서명 방법 을 포함 할 때 프 록 시 클래스 의 인터페이스 순 서 는 매우 중요 하 다.프 록 시 인 스 턴 스 에서 중복 방법 을 호출 할 때 호출 처리 프로그램 Method 대상 에 게 전달 되 는 성명 류 가 인터페이스 (이 인 터 페 이 스 를 통 해 프 록 시 방법 을 호출 할 수 있 는 참조 형식 으로 할당 할 대상 이 될 필요 가 없습니다.이 제한 이 존재 하 는 이 유 는 생 성 된 프 록 시 클래스 의 해당 방법 이 어떤 인 터 페 이 스 를 통 해 호출 되 는 지 확인 할 수 없 기 때문이다.따라서 프 록 시 인 스 턴 스 에서 중복 방법 을 호출 할 때 첫 번 째 인터페이스 에 있 는 방법 Method 대상 이 인 터 페 이 스 를 포함 하 는 프 록 시 클래스 목록 의 방법 (직접 또는 슈퍼 인 터 페 이 스 를 통 해 계승) 은 호출 처리 프로그램 invoke 방법 으로 전 달 됩 니 다. 이 방법 이 어떤 인용 유형 을 통 해 호출 되 든 간 에.
    프 록 시 인터페이스 에 어떤 방법 이 포함 되 어 있 으 면 이름과 매개 변수 서명 이 java.lang.ObjecthashCode, equals 또는 toString 방법 과 같 으 면 프 록 시 인 스 턴 스 에서 이러한 방법 을 호출 할 때 호출 처리 프로그램 Method 대상 java.lang.Object 을 성명 류 로 전달 합 니 다.다시 말 하면 java.lang.Object 공공 비 최종 방법 이론 적 으로 모든 대리 인터페이스 전에 어느 Method 대상 이 호출 처리 프로그램 에 전달 되 는 지 확인 할 수 있다.
    또한 중복 방법 이 호출 처리 프로그램 에 할당 되 었 을 때 invoke 방법 은 검 사 를 거 친 이상 유형 만 던 질 수 있 으 며, 이 이상 유형 은 모든 프 록 시 인터페이스 (이 를 통 해 호출 가능) 에서 방법 throws 자 구 를 사용 하여 이상 유형 을 할당 할 수 있 음 을 주의해 야 한다.invoke 방법 이 검 사 를 거 친 이상 을 던 지면 이 이상 은 프 록 시 인터페이스 (호출 가능) 에서 설명 할 수 있 는 이상 유형 에 할당 되 지 않 았 습 니 다. 이 프 록 시 인 스 턴 스 의 호출 은 검사 되 지 않 은 UndeclaredThrowableException 을 던 집 니 다.이 제한 은 invoke 방법 으로 전 달 된 Method 대상 에서 호출 getExceptionTypes 된 모든 이상 유형 을 invoke 방법 으로 성공 적 으로 던 질 수 있 는 것 이 아니 라 는 것 을 나타 낸다.
    5.public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) throws IllegalArgumentException
     
    지정 한 인터페이스의 프 록 시 클래스 인 스 턴 스 를 되 돌려 줍 니 다. 이 인 터 페 이 스 는 지정 한 호출 처리 프로그램 에 방법 을 호출 할 수 있 습 니 다.이 방법 은 다음 과 같다.
         Proxy.getProxyClass(loader, interfaces).
             getConstructor(new Class[] { InvocationHandler.class }).
             newInstance(new Object[] { handler });
     
    
    
    
    Proxy.newProxyInstance 던 지기 IllegalArgumentException 원인 은 Proxy.getProxyClass 와 같다.
    인자:loader - 프 록 시 클래스 를 정의 하 는 클래스 프로세서interfaces - 에이전트 클래스 가 실현 할 인터페이스 목록h - 할당 방법 호출 처리 프로그램
    돌아 가기:
    프 록 시 클래스 가 있 는 지정 한 호출 처리 프로그램의 프 록 시 인 스 턴 스 는 지정 한 클래스 로 더 에 의 해 정의 되 고 지정 한 인 터 페 이 스 를 실현 합 니 다.
    던 지기:IllegalArgumentException - getProxyClass 에 전 달 된 매개 변수 에 대한 어떠한 제한 도 위반 하면NullPointerException - 만약 interfaces 배열 매개 변수 나 그 어떠한 요소 가 null 이거 나 호출 처리 프로그램 이 null 일 경우

    좋은 웹페이지 즐겨찾기