JavaTM Platform
Standard Ed. 6

java.lang.reflect
클래스 Proxy

java.lang.Object 
  상위를 확장 java.lang.reflect.Proxy
모든 구현된 인터페이스:
Serializable


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 를 구현하고 있습니다. 프록시 인터페이스의 1 개를 사용한 프록시 인스턴스에서의 메소드 호출은, 인스턴스의 호출 핸들러의 invoke 메소드에 발송 되어 불려 간 메소드를 식별하는 java.lang.reflect.Method 객체, 및 인수를 포함하는 Object 형의 배열을 프록시 인스턴스에 인도합니다. 호출 핸들러는 encode 된 메소드 호출을 적절히 처리해, 호출 핸들러가 돌려주는 결과가, 프록시 인스턴스에서의 메소드 호출의 결과로서 돌려주어집니다.

프록시 클래스에는, 다음의 특성이 있습니다.

프록시 인스턴스에는, 다음의 특성이 있습니다.

복수의 프록시 인터페이스로 중복 하는 메소드

복수의 인터페이스에, 같은 이름과 파라메이타시그니챠를 가지는 메소드가 포함되는 경우는, 프록시 클래스의 인터페이스의 차례가 구별됩니다. 프록시 인스턴스상에서 「중복 하는 메소드」가 불려 갔을 경우, 호출 핸들러에게 건네지는 Method 객체로, 프록시 메소드의 호출에 사용된 인터페이스의 참조형으로부터 선언 클래스를 할당하지 못하는 것이 있습니다. 이러한 제약이 존재하는 것은, 생성된 프록시 클래스내의 대응하는 메소드의 구현으로부터, 그 구현이 불려 갔을 때에 사용된 인터페이스를 특정할 수 없기 때문입니다. 이 때문에, 프록시 인스턴스상에서 중복 하는 메소드가 불려 갔을 경우는, 메소드 호출에 사용된 참조형 에 관계없이, 프록시 클래스의 인터페이스 리스트로 그 메소드 (직접 또는 슈퍼 인터페이스로부터 상속)를 포함한 인터페이스 가운데, 최초의 인터페이스의 메소드의 Method 객체가 호출해 핸들러의 invoke 메소드에게 건네집니다.

프록시 인터페이스에,java.lang.ObjecthashCode,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 되지 않는 것이 있습니다.

도입된 버젼:
1.3
관련 항목:
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
 

필드의 상세

h

protected InvocationHandler  h
이 프록시 인스턴스의 호출 핸들러입니다.

생성자 의 상세

Proxy

protected Proxy(InvocationHandler  h)
지정된 값으로, 서브 클래스 (일반적으로은 동적 프록시 클래스)로부터 그 호출 핸들러에 새로운 Proxy 인스턴스를 구축합니다.

파라미터:
h - 이 프록시 인스턴스의 호출 핸들러
메소드의 상세

getProxyClass

public static Class <? > getProxyClass(ClassLoader  loader,
                                     Class <? >... interfaces)
                              throws IllegalArgumentException 
클래스 로더와 인터페이스의 배열의 지정된 프록시 클래스의 java.lang.Class 객체를 돌려줍니다. 프록시 클래스는 지정된 클래스 로더에 의해 정의되어 지정된 인터페이스를 모두 구현합니다. 인터페이스의 같은 순열의 프록시 클래스가 벌써 클래스 로더에 의해 정의되고 있는 경우, 기존의 프록시 클래스가 돌려주어집니다. 그렇지 않은 경우는, 이러한 인터페이스의 프록시 클래스가 동적으로 생성되어 클래스 로더에 의해 정의됩니다.

Proxy.getProxyClass 에 건네줄 수 있는 파라미터에는, 몇개의 제약이 있습니다.

이러한 제약에 대해서 위반이 발생했을 경우는,Proxy.getProxyClass 에 의해 IllegalArgumentException 가 throw 됩니다. interfaces 배열의 인수 또는 요소가 null 의 경우는,NullPointerException 가 throw 됩니다.

프록시 인터페이스는, 차례가 구별됩니다. 프록시 클래스를 2 회 요구했을 때에, 인터페이스의 편성이 같아 차례가 다른 경우는, 2 개(살)이 다른 프록시 클래스가 작성됩니다.

파라미터:
loader - 프록시 클래스를 정의하는 클래스 로더
interfaces - 프록시 클래스가 구현하는 인터페이스의 리스트
반환값:
지정된 클래스 로더로 정의되어 지정된 인터페이스를 구현하는 프록시 클래스
예외:
IllegalArgumentException - getProxyClass 에 인도해지는 파라미터에 관한 제약중 한쪽이 지켜질 수 없었던 경우
NullPointerException - interfaces 배열의 인수 또는 그 요소중 한쪽이 null 의 경우

newProxyInstance

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 의 경우, 또는 호출해 핸들러 hnull 의 경우

isProxyClass

public static boolean isProxyClass(Class <? > cl)
지정된 클래스가 getProxyClass 메소드 또는 newProxyInstance 메소드를 사용해 동적으로 생성되어 프록시 클래스가 되는 경우에만, true 를 돌려줍니다.

이 메소드의 신뢰성은, 이 메소드에 의해 시큐리티 보호를 할 수 있을지 어떨지를 결정할 때에 중요합니다. 이 때문에, 해당 클래스가 Proxy 를 확장할지 어떨지를 이 메소드의 구현으로 테스트하는 것 만으로는 충분하다고는 말할 수 없습니다.

파라미터:
cl - 테스트하는 클래스
반환값:
클래스가 프록시 클래스의 경우는 true, 그렇지 않은 경우는 false
예외:
NullPointerException - clnull 의 경우

getInvocationHandler

public static InvocationHandler  getInvocationHandler(Object  proxy)
                                              throws IllegalArgumentException 
지정된 프록시 인스턴스의 호출 핸들러를 돌려줍니다.

파라미터:
proxy - 호출 핸들러를 돌려주는 프록시 인스턴스
반환값:
프록시 인스턴스의 호출 핸들러
예외:
IllegalArgumentException - 인수가 프록시 인스턴스가 아닌 경우

JavaTM Platform
Standard Ed. 6

버그의 보고와 기능의 요청
한층 더 자세한 API 레퍼런스 및 개발자 문서에 대해서는,Java SE 개발자용 문서를 참조해 주세요. 개발자전용의 상세한 해설, 개념의 개요, 용어의 정의, 버그의 회피책, 및 코드 실례가 포함되어 있습니다.

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.