|
JavaTM Platform Standard Ed. 6 |
|||||||||
전의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세 : 필드 | 생성자 | 메소드 |
java.lang.Objectjava.lang.reflect.Proxy
public class Proxy
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
를 구현하고 있습니다. 프록시 인터페이스의 1 개를 사용한 프록시 인스턴스에서의 메소드 호출은, 인스턴스의 호출 핸들러의 invoke
메소드에 발송 되어 불려 간 메소드를 식별하는 java.lang.reflect.Method
객체, 및 인수를 포함하는 Object
형의 배열을 프록시 인스턴스에 인도합니다. 호출 핸들러는 encode 된 메소드 호출을 적절히 처리해, 호출 핸들러가 돌려주는 결과가, 프록시 인스턴스에서의 메소드 호출의 결과로서 돌려주어집니다.
프록시 클래스에는, 다음의 특성이 있습니다.
$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
등의, bootstrap 클래스 로더에 의해 로드 되는 시스템 클래스의 java.security.ProtectionDomain
와 같습니다. 프록시 클래스의 코드는, 신뢰된 시스템 코드에 의해 생성되기 (위해)때문에입니다. 표준에서는, 이 보호 도메인에 대해서 java.security.AllPermission
가 주어집니다.
InvocationHandler
의 구현을 취하는 1 개의 public 생성자 이 있습니다. 리플렉션 API 를 사용해 public 생성자 에 액세스 하는 것 외에,Proxy.newInstance
메소드를 호출해 프록시 인스턴스를 생성할 수도 있습니다. 이 메소드는 Proxy.getProxyClass
의 호출 동작을, 호출 핸들러를 가지는 생성자 의 호출과 결합합니다.
프록시 인스턴스에는, 다음의 특성이 있습니다.
proxy
프록시 인스턴스, 및 그 Foo
프록시 클래스에 의해 구현된 인터페이스에 대해서 다음의 식을 실행하면(자), true 가 돌려주어집니다.
proxy instanceof Foo
다음의 캐스트 조작은, 정상 종료해,ClassCastException
는 throw 되지 않습니다.
(Foo) proxy
Proxy.getInvocationHandler
메소드는, 그 인수로서 건네받은 프록시 인스턴스에 관련하는 호출 핸들러를 돌려줍니다.
invoke
메소드에 발송 됩니다.
java.lang.Object
에 선언되고 있는 hashCode
,equals
또는 toString
호출은, 전술한 것처럼 인터페이스 메소드 호출과 같은 방법으로, encode 되어 호출 핸들러의 invoke
메소드에 발송 됩니다. invoke
에게 건네지는 Method
객체의 선언 클래스는,java.lang.Object
입니다. java.lang.Object
로부터 상속되는 프록시 인스턴스의 그 외의 public 메소드는, 프록시 클래스에 의해 오버라이드(override) 되지 않습니다. 이 때문에, 이러한 메소드의 호출은,java.lang.Object
의 인스턴스에 대한 호출과 같게 행해집니다.
복수의 인터페이스에, 같은 이름과 파라메이타시그니챠를 가지는 메소드가 포함되는 경우는, 프록시 클래스의 인터페이스의 차례가 구별됩니다. 프록시 인스턴스상에서 「중복 하는 메소드」가 불려 갔을 경우, 호출 핸들러에게 건네지는 Method
객체로, 프록시 메소드의 호출에 사용된 인터페이스의 참조형으로부터 선언 클래스를 할당하지 못하는 것이 있습니다. 이러한 제약이 존재하는 것은, 생성된 프록시 클래스내의 대응하는 메소드의 구현으로부터, 그 구현이 불려 갔을 때에 사용된 인터페이스를 특정할 수 없기 때문입니다. 이 때문에, 프록시 인스턴스상에서 중복 하는 메소드가 불려 갔을 경우는, 메소드 호출에 사용된 참조형 에 관계없이, 프록시 클래스의 인터페이스 리스트로 그 메소드 (직접 또는 슈퍼 인터페이스로부터 상속)를 포함한 인터페이스 가운데, 최초의 인터페이스의 메소드의 Method
객체가 호출해 핸들러의 invoke
메소드에게 건네집니다.
프록시 인터페이스에,java.lang.Object
의 hashCode
,equals
, 또는 toString
메소드와 같은 이름 및 파라메이타시그니챠를 가지는 메소드가 포함되는 경우는, 프록시 인스턴스상에서 그 메소드가 불려 가면(자), 호출 핸들러에게 건네지는 Method
객체의 선언 클래스는 java.lang.Object
가 됩니다. 즉, public 로 비 final 인 java.lang.Object
의 메소드는, 호출 핸들러에 건네주는 Method
객체를 결정할 때, 논리적으로 다른 프록시 인터페이스보다 우선됩니다.
중복 하는 메소드가 호출해 핸들러에 발송 되었을 경우는,invoke
메소드로부터 throw 할 수 있는 예외의 형태는, 체크되는 형태 가운데, 불려 가는 모든 프록시 인터페이스의 메소드로 지정되고 있는,throws
구의 예외의 형태에 할당할 수가 있는 것으로 한정됩니다. invoke
메소드가, 호출에 사용할 수 있는 프록시 인터페이스의 1 개의 메소드로 선언된 예외 타입의 어느 것에도 할당하고 할 수 없는 확인이 끝난 예외를 throw 했을 경우, 확인되어 있지 않은 UndeclaredThrowableException
가 프록시 인스턴스에서의 호출에 의해 throw 됩니다. 즉,invoke
메소드에게 건네진 Method
객체상에서,getExceptionTypes
를 호출해 예외의 형태를 취득해도,invoke
메소드로부터 정상적으로 throw 되지 않는 것이 있습니다.
InvocationHandler
,
직렬화 된 형식 필드의 개요 | |
---|---|
protected InvocationHandler |
h
이 프록시 인스턴스의 호출 핸들러입니다. |
생성자 의 개요 | |
---|---|
protected |
Proxy (InvocationHandler h)
지정된 값으로, 서브 클래스 (일반적으로은 동적 프록시 클래스)로부터 그 호출 핸들러에 새로운 Proxy 인스턴스를 구축합니다. |
메소드의 개요 | |
---|---|
static InvocationHandler |
getInvocationHandler (Object proxy)
지정된 프록시 인스턴스의 호출 핸들러를 돌려줍니다. |
static Class <? > |
getProxyClass (ClassLoader loader,
Class <? >... interfaces)
클래스 로더와 인터페이스의 배열의 지정된 프록시 클래스의 java.lang.Class 객체를 돌려줍니다. |
static boolean |
isProxyClass (Class <? > cl)
지정된 클래스가 getProxyClass 메소드 또는 newProxyInstance 메소드를 사용해 동적으로 생성되어 프록시 클래스가 되는 경우에만, true 를 돌려줍니다. |
static Object |
newProxyInstance (ClassLoader loader,
Class <? >[] interfaces,
InvocationHandler h)
지정된 호출 핸들러에 대해서 메소드 호출을 발송 하는, 지정된 인터페이스의 프록시 클래스의 인스턴스를 돌려줍니다. |
클래스 java.lang. Object 로부터 상속된 메소드 |
---|
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait |
필드의 상세 |
---|
protected InvocationHandler h
생성자 의 상세 |
---|
protected Proxy(InvocationHandler h)
Proxy
인스턴스를 구축합니다.
h
- 이 프록시 인스턴스의 호출 핸들러메소드의 상세 |
---|
public static Class <? > getProxyClass(ClassLoader loader, Class <? >... interfaces) throws IllegalArgumentException
java.lang.Class
객체를 돌려줍니다. 프록시 클래스는 지정된 클래스 로더에 의해 정의되어 지정된 인터페이스를 모두 구현합니다. 인터페이스의 같은 순열의 프록시 클래스가 벌써 클래스 로더에 의해 정의되고 있는 경우, 기존의 프록시 클래스가 돌려주어집니다. 그렇지 않은 경우는, 이러한 인터페이스의 프록시 클래스가 동적으로 생성되어 클래스 로더에 의해 정의됩니다.
Proxy.getProxyClass
에 건네줄 수 있는 파라미터에는, 몇개의 제약이 있습니다.
interfaces
배열의 모든 Class
객체는, 클래스 또는 원시형은 아니고 인터페이스를 나타내지 않으면 안 된다
interfaces
배열의 복수의 요소가, 같은 Class
객체를 참조해서는 안 된다
cl
, 각 인터페이스가 i
의 경우는, 다음의 식이 true 가 아니면 안된다
Class.forName(i.getName(), false, cl) == i
interfaces
배열의 사이즈는 65535 를 넘어서는 안 된다
이러한 제약에 대해서 위반이 발생했을 경우는,Proxy.getProxyClass
에 의해 IllegalArgumentException
가 throw 됩니다. interfaces
배열의 인수 또는 요소가 null
의 경우는,NullPointerException
가 throw 됩니다.
프록시 인터페이스는, 차례가 구별됩니다. 프록시 클래스를 2 회 요구했을 때에, 인터페이스의 편성이 같아 차례가 다른 경우는, 2 개(살)이 다른 프록시 클래스가 작성됩니다.
loader
- 프록시 클래스를 정의하는 클래스 로더interfaces
- 프록시 클래스가 구현하는 인터페이스의 리스트
IllegalArgumentException
- getProxyClass
에 인도해지는 파라미터에 관한 제약중 한쪽이 지켜질 수 없었던 경우
NullPointerException
- interfaces
배열의 인수 또는 그 요소중 한쪽이 null
의 경우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
는,Proxy.getProxyClass
의 경우와 같은 이유로써,IllegalArgumentException
를 throw 합니다.
loader
- 프록시 클래스를 정의하는 클래스 로더interfaces
- 프록시 클래스가 구현하는 인터페이스의 리스트h
- 메소드 호출의 발송처의 호출 핸들러
IllegalArgumentException
- getProxyClass
에 인도해지는 파라미터에 관한 제약중 한쪽이 지켜질 수 없었던 경우
NullPointerException
- interfaces
배열의 인수 또는 그 요소중 한쪽이 null
의 경우, 또는 호출해 핸들러 h
가 null
의 경우public static boolean isProxyClass(Class <? > cl)
getProxyClass
메소드 또는 newProxyInstance
메소드를 사용해 동적으로 생성되어 프록시 클래스가 되는 경우에만, true 를 돌려줍니다.
이 메소드의 신뢰성은, 이 메소드에 의해 시큐리티 보호를 할 수 있을지 어떨지를 결정할 때에 중요합니다. 이 때문에, 해당 클래스가 Proxy
를 확장할지 어떨지를 이 메소드의 구현으로 테스트하는 것 만으로는 충분하다고는 말할 수 없습니다.
cl
- 테스트하는 클래스
true
, 그렇지 않은 경우는 false
NullPointerException
- cl
가 null
의 경우public static InvocationHandler getInvocationHandler(Object proxy) throws IllegalArgumentException
proxy
- 호출 핸들러를 돌려주는 프록시 인스턴스
IllegalArgumentException
- 인수가 프록시 인스턴스가 아닌 경우
|
JavaTM Platform Standard Ed. 6 |
|||||||||
전의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세 : 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.