자바 동적 에이전트 (1)
8962 단어 자바
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.Object
의 hashCode
, 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
일 경우
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.