JavaTM Platform
Standard Ed. 6

java.rmi.server
클래스 RMIClassLoader

java.lang.Object 
  상위를 확장 java.rmi.server.RMIClassLoader


public class RMIClassLoader
extends Object

RMIClassLoader 는, RMI 를 사용해 동적으로 클래스를 로드하기 위한 static 메소드로부터 구성됩니다. 이 클래스 로더에는, 네트워크의 장소 (1 개(살) 이상의 URL)에서 클래스를 로드하는 메소드나, 기존의 클래스가 포함되고 있는 장소를 취득하는 메소드가 짜넣어지고 있습니다. 이러한 메소드는, 원격 메소드 호출의 인수나 반환값에 포함되는 클래스를 정렬화 및 비정렬화할 때, RMI 런타임에 의해 사용됩니다. 또, 이러한 메소드를 어플리케이션으로부터 직접 호출해, 클래스를 동적으로 로드할 수도 있습니다.

다음의 static 메소드의 구현은, 이러한 서비스 프로바이더 인터페이스 RMIClassLoaderSpi 의 인스턴스에 의해 제공됩니다.

이 메소드중 한쪽이 불려 가면(자), 그 동작이 서비스 프로바이더 인스턴스의 대응하는 메소드에 위양 됩니다. 각 메소드가 프로바이더 인스턴스에 위양 하는 방법의 자세한 것은, 각 메소드의 메뉴얼을 참조해 주세요.

서비스 프로바이더 인스턴스는 다음과 같이 선택됩니다.

도입된 버젼:
JDK1. 1
관련 항목:
RMIClassLoaderSpi

메소드의 개요
static String getClassAnnotation (Class <? > cl)
          클래스 정의의 위치를 나타내는 주석 캐릭터 라인을 돌려줍니다.
static ClassLoader getClassLoader (String  codebase)
          지정된 코드 베이스 URL 패스로부터 클래스를 로드하는 클래스 로더를 돌려줍니다.
static RMIClassLoaderSpi getDefaultProviderInstance ()
          서비스 프로바이더 인터페이스 RMIClassLoaderSpi 의 디폴트 프로바이더의 정규 인스턴스를 돌려줍니다.
static Object getSecurityContext (ClassLoader  loader)
          추천 되고 있지 않습니다.  대체는 없습니다. Java 2 플랫폼 1.2 이후의 RMI 에서는, 클래스 로더의 시큐리티 문맥을 취득하기 위해서 이 메소드를 사용하지 않습니다
static Class <? > loadClass (String  name)
          추천 되고 있지 않습니다.  loadClass(String, String) 메소드로 옮겨졌습니다
static Class <? > loadClass (String  codebase, String  name)
          지정된 코드 베이스 URL 패스로부터 클래스를 로드합니다.
static Class <? > loadClass (String  codebase, String  name, ClassLoader  defaultLoader)
          지정된 로더를 사용할 수도 있습니다.
static Class <? > loadClass (URL  codebase, String  name)
          지정된 코드 베이스 URL 로부터 클래스를 로드합니다.
static Class <? > loadProxyClass (String  codebase, String [] interfaces, ClassLoader  defaultLoader)
          지정된 이름을 가지는 인터페이스군을 구현한 동적 프록시 클래스 (Proxy 를 참조)를, 지정된 코드 베이스 URL 패스로부터 로드합니다.
 
클래스 java.lang. Object 로부터 상속된 메소드
clone , equals , finalize , getClass , hashCode , notify , notifyAll , toString , wait , wait , wait
 

메소드의 상세

loadClass

@Deprecated 
public static Class <? > loadClass(String  name)
                          throws MalformedURLException ,
                                 ClassNotFoundException 
추천 되고 있지 않습니다.  loadClass(String, String) 메소드로 옮겨졌습니다

지정된 name 를 이름에 가지는 클래스를 로드합니다.

이 메소드는 처리를 loadClass(String, String) 메소드에 위양 합니다. 1 개째의 인수에는 null 가, 2 개째의 인수에는 name 가 건네받습니다.

파라미터:
name - 로드 대상 클래스의 이름
반환값:
로드 된 클래스를 나타내는 Class 객체
예외:
MalformedURLException - 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException - 클래스의 정의가 코드 베이스의 위치에 없었던 경우
관련 항목:
loadClass(String, String)

loadClass

public static Class <? > loadClass(URL  codebase,
                                 String  name)
                          throws MalformedURLException ,
                                 ClassNotFoundException 
지정된 코드 베이스 URL 로부터 클래스를 로드합니다. codebasenull 인 경우, 이 메소드의 동작은,loadClass(String, String) 메소드의 인수에 null codebase 와 동일 클래스명을 지정했을 경우와 같게 됩니다.

이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.loadClass(String, String, ClassLoader) 메소드에 처리를 위양 합니다. 이 때, 지정한 URL 로 URL.toString() 를 호출한 결과 (codebase 가 null 의 경우는 null)가 최초의 인수로서name 가 2 개째의 인수로서null 가 3 개째의 인수로서 건네받습니다.

파라미터:
codebase - 클래스의 로드원의 URL, 또는 null
name - 로드 대상 클래스의 이름
반환값:
로드 된 클래스를 나타내는 Class 객체
예외:
MalformedURLException - codebasenull 로, 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException - 클래스의 정의가 지정된 URL 에 없었던 경우

loadClass

public static Class <? > loadClass(String  codebase,
                                 String  name)
                          throws MalformedURLException ,
                                 ClassNotFoundException 
지정된 코드 베이스 URL 패스로부터 클래스를 로드합니다.

이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.loadClass(String, String, ClassLoader) 메소드에 처리를 위양 합니다. 이 때,codebase 가 최초의 인수로서name 가 2 개째의 인수로서null 가 3 개째의 인수로서 건네받습니다.

파라미터:
codebase - 클래스의 로드원의 URL 의 리스트 (단락 문자는 스페이스), 또는 null
name - 로드 대상 클래스의 이름
반환값:
로드 된 클래스를 나타내는 Class 객체
예외:
MalformedURLException - codebasenull 이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebasenull 로 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException - 클래스의 정의가 지정된 장소에 없었던 경우
도입된 버젼:
1.2

loadClass

public static Class <? > loadClass(String  codebase,
                                 String  name,
                                 ClassLoader  defaultLoader)
                          throws MalformedURLException ,
                                 ClassNotFoundException 
지정된 로더를 사용할 수도 있습니다. 프로바이더 구현의 호출원이, 상황에 따라 사용해야 할 추가 클래스 로더 (호출원의 스택상의 로더등)를 프로바이더 구현에 제공하는 경우에, 이 메소드를 사용합니다. 일반적으로, 프로바이더 구현은, 지정된 defaultLoader 를 사용해 지정된 클래스의 해결을 시도한 후에, 코드 베이스 URL 패스로부터의 클래스의 해결을 시도합니다.

이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.loadClass(String, String, ClassLoader) 메소드에 처리를 위양 합니다. 이 때,codebase 가 최초의 인수로서name 가 2 개째의 인수로서defaultLoader 가 3 개째의 인수로서 건네받습니다.

파라미터:
codebase - 클래스의 로드원의 URL 의 리스트 (단락 문자는 스페이스), 또는 null
name - 로드 대상 클래스의 이름
defaultLoader - 상황에 따라 사용하는 추가 클래스 로더, 또는 null
반환값:
로드 된 클래스를 나타내는 Class 객체
예외:
MalformedURLException - codebasenull 이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebasenull 로 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException - 클래스의 정의가 지정된 장소에 없었던 경우
도입된 버젼:
1.4

loadProxyClass

public static Class <? > loadProxyClass(String  codebase,
                                      String [] interfaces,
                                      ClassLoader  defaultLoader)
                               throws ClassNotFoundException ,
                                      MalformedURLException 
지정된 이름을 가지는 인터페이스군을 구현한 동적 프록시 클래스 (Proxy 를 참조)를, 지정된 코드 베이스 URL 패스로부터 로드합니다.

이러한 인터페이스의 해결은, 지정된 codebase 를 사용해 loadClass(String, String) 메소드 경유로 로드 된 클래스와 같은 방법으로 행해집니다.

이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.loadProxyClass(String, String[], ClassLoader) 메소드에 처리를 위양 합니다. 이 때,codebase 가 최초의 인수로서interfaces 가 2 개째의 인수로서defaultLoader 가 3 개째의 인수로서 건네받습니다.

파라미터:
codebase - 클래스의 로드원의 URL 의 리스트 (단락 문자는 스페이스), 또는 null
interfaces - 프록시 클래스가 구현하는 인터페이스의 이름
defaultLoader - 상황에 따라 사용하는 추가 클래스 로더, 또는 null
반환값:
지정된 인터페이스를 구현하는 동적 프록시 클래스
예외:
MalformedURLException - codebasenull 이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebasenull 로 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException - 지정된 인터페이스의 정의중 한쪽이 지정된 장소에 발견되지 않는 경우, 또는 동적 프록시 클래스의 작성에 실패했을 경우 (Proxy.getProxyClass(ClassLoader, Class[]) 가, 지정된 인터페이스 리스트에 대해서 IllegalArgumentException 를 throw 했을 때 등)
도입된 버젼:
1.4

getClassLoader

public static ClassLoader  getClassLoader(String  codebase)
                                  throws MalformedURLException ,
                                         SecurityException 
지정된 코드 베이스 URL 패스로부터 클래스를 로드하는 클래스 로더를 돌려줍니다.

반환되는 클래스 로더는,loadClass(String, String) 메소드가 같은 codebase 인수를 지정해 클래스를 로드할 때 사용하는 클래스 로더와 같습니다.

이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.getClassLoader(String) 메소드에 처리를 위양 합니다. 이 때,codebase 가 인수로서 건네받습니다.

시큐리티 매니저가 존재하는 경우는,RuntimePermission("getClassLoader") 액세스권을 사용해 checkPermission 메소드가 불려 가SecurityException 가 체크됩니다. 이 메소드의 프로바이더 구현은, 호출측 문맥이 코드 베이스 URL 패스내의 모든 URL 에 대한 액세스권을 가지고 있을지 어떨지에 임해서, 시큐리티 체크를 실시하는 일도 있습니다.

파라미터:
codebase - 반환되는 클래스 로더가 로드하는 클래스가 포함되고 있는 URL 의 리스트 (단락 문자는 스페이스), 또는 null
반환값:
지정된 코드 베이스 URL 패스로부터 클래스를 로드하는 클래스 로더
예외:
MalformedURLException - codebasenull 이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebasenull 로 한편 클래스 로더의 식별시에 사용된 프로바이더 고유 URL 가 무효인 경우
SecurityException - 시큐리티 매니저가 존재할 경우에, 그 checkPermission 메소드가 실패했을 경우. 또는, 호출측이 코드 베이스 URL 패스내의 모든 URL 에 대한 액세스권을 가지고 있지 않은 경우
도입된 버젼:
1.3

getClassAnnotation

public static String  getClassAnnotation(Class <? > cl)
클래스 정의의 위치를 나타내는 주석 캐릭터 라인을 돌려줍니다. RMI 는 이것을 사용해, 지정된 클래스의 객체의 정렬화를 실시할 때에, 클래스 기술자에게 주석을 더합니다.

이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.getClassAnnotation(Class) 메소드에 처리를 위양 합니다. 이 때,cl 가 인수로서 건네받습니다.

파라미터:
cl - 주석을 취득하는 대상의 클래스
반환값:
정렬화시로 지정된 클래스에 주석을 더하기 위해서(때문에) 사용되는 캐릭터 라인, 또는 null
예외:
NullPointerException - clnull 의 경우
도입된 버젼:
1.2

getDefaultProviderInstance

public static RMIClassLoaderSpi  getDefaultProviderInstance()
서비스 프로바이더 인터페이스 RMIClassLoaderSpi 의 디폴트 프로바이더의 정규 인스턴스를 돌려줍니다. 시스템 프로퍼티 java.rmi.server.RMIClassLoaderSpi 가 정의되어 있지 않은 경우, 다음에 나타내는 RMIClassLoader 의 static 메소드는, 서비스 프로바이더 인스턴스로서 디폴트 프로바이더의 정규 인스턴스를 사용합니다.

시큐리티 매니저가 존재하는 경우,RuntimePermission("setFactory") 액세스권을 사용해 checkPermission 메소드가 불려 가SecurityException 가 체크됩니다.

디폴트의 서비스 프로바이더 인스턴스는,RMIClassLoaderSpi 를 다음과 같이 구현합니다.

getClassAnnotation 메소드는, 지정된 클래스 정의의 다운로드에 원격측이 사용하는 코드 베이스 URL 패스를 나타내는 String 를 돌려줍니다. 반환되는 캐릭터 라인의 형식은, 공백에서 단락지어진 URL 의 패스입니다. 반환되는 코드 베이스의 캐릭터 라인은, 다음에 나타내도록(듯이), 지정된 클래스에 정의되고 있는 클래스 로더에 따라서 다릅니다.

  • 정의되고 있는 클래스 로더가 시스템 클래스 로더 (ClassLoader.getSystemClassLoader() 를 참조), 시스템 클래스 로더의 부모 (인스톨 끝난 확장 클래스에 사용되는 로더 등), 또는 bootstrap 클래스 로더 (null 로 나타내진다)의 경우,java.rmi.server.codebase 프로퍼티의 값 (또는 이전에 캐쉬된 값)이 반환된다. 이 프로퍼티의 값이 설정되어 있지 않은 경우는,null 가 반환된다

  • 정의되고 있는 클래스 로더가 URLClassLoader 의 인스턴스의 경우는, 로더의 getURLs 메소드 호출로부터 반환되는, 외부 형식의 URL 의 리스트 (단락 문자는 스페이스)가 반환된다. URLClassLoader 가 이 프로바이더에 의해 작성되어 그 loadClass 또는 loadProxyClass 메소드가 사용되는 경우, 관련하는 코드 베이스 캐릭터 라인을 취득하기 위한 액세스권은 필요없다. URLClassLoader 인스턴스가 이 프로바이더 이외에 작성되어 시큐리티 매니저가 존재하는 경우는,getURLs 메소드로부터 URL 가 돌려주어질 때마다,openConnection(). getPermission() 호출에 의해 반환된 액세스권을 사용해 시큐리티 매니저의 checkPermission 메소드가 불려 간다. 이러한 호출의 어느쪽이든으로 SecurityException 또는 IOException 가 throw 되었을 경우,java.rmi.server.codebase 프로퍼티의 값이 반환된다. 이 프로퍼티이 설정되어 있지 않은 경우는,null 가 반환된다

  • 정의되고 있는 클래스 로더가 URLClassLoader 의 인스턴스가 아닌 경우,java.rmi.server.codebase 프로퍼티의 값 (또는 이전에 캐쉬된 값)이 반환된다. 이 프로퍼티이 설정되어 있지 않은 경우는,null 가 반환된다

codebase 라는 이름의 String 파라미터 (공백에서 단락지어진 URL 의 리스트)를 취하는, 다음에 설명하는 각 메소드 구현에 대해, 메소드가 불려 갈 때마다 특정의 「코드 베이스 로더」를 관련지을 수 있습니다. 코드 베이스 로더는,codebase 인수와 현재의 thread의 문맥 클래스 로더 (Thread.getContextClassLoader() 를 참조)를 조합해 검색됩니다. 시큐리티 매니저가 존재하는 경우, 이 프로바이더는, 클래스 로더 인스턴스의 내부 테이블 (적어도 URLClassLoader 의 인스턴스를 포함한다)을 보관 유지합니다. 이 테이블의 키는, 부모의 클래스 로더와 코드 베이스 URL 패스 (URL 의 순서 첨부 리스트)의 페어입니다. codebase 인수가 null 의 경우, 코드 베이스 URL 패스는, 시스템 프로퍼티 java.rmi.server.codebase 의 값, 이전의 캐쉬된 값의 어느 쪽인가에 됩니다. 어느 코드 베이스 URL 패스가 있는 특정의 문맥내에서 이하의 몇개의 메소드의 호출의 codebase 인수로서 건네받았을 경우, 테이블내의 로더 가운데, 패스가 지정된 코드 베이스 URL 패스, 부모가 현재 thread의 문맥 클래스 로더인 것 같은 로더가, 코드 베이스 로더가 됩니다. 그러한 로더가 존재하지 않는 경우는, 작성되어 테이블에 추가됩니다. 다만, 이 테이블은, 도달 불가능한 로더와 그 로더에 정의되고 있는 클래스가 가베지 컬렉트되도록(듯이), 로더에의 강참조를 보관 유지하지 않습니다. 시큐리티 매니저가 존재하지 않을 때에 신뢰되지 않는 코드가 가상 머신에 암묵적으로 로드 되지 않게 하기 위해서, 시큐리티 매니저가 설정되어 있지 않은 경우는, 코드 베이스 로더는 현재의 thread의 문맥 클래스 로더가 됩니다 (지정된 코드 베이스 URL 패스는 무시되어 원격 클래스를 로드할 수 없게 된다).

getClassLoader 메소드는, 지정된 코드 베이스 URL 패스의 코드 베이스 로더를 돌려줍니다. 시큐리티 매니저가 존재하는 경우, 호출측 문맥에 코드 베이스 URL 패스내의 모든 URL 에 대한 액세스권이 없을 때는,SecurityException 가 throw 됩니다.

loadClass 메소드는, 지정된 이름의 클래스를 다음의 방법으로 로드를 시도합니다.

defaultLoader 인수가 null 가 아닌 경우는, 우선 defaultLoader 를 사용해, 지정된 name 의 클래스를 로드하려고 합니다. 예를 들어, 다음과 같이 평가합니다.
Class.forName(name, false, defaultLoader)
 
클래스를 defaultLoader 로부터 로드할 수 있었을 경우, 그 클래스가 돌려주어집니다. ClassNotFoundException 이외의 예외가 throw 되었을 경우는, 그 예외가 호출해 측에 throw 됩니다.

다음에,loadClass 메소드가, 지정된 코드 베이스 URL 패스의 코드 베이스 로더를 사용해, 지정된 name 의 클래스의 로드를 시도합니다. 시큐리티 매니저가 존재하는 경우, 호출측 문맥에는 코드 베이스 URL 패스내의 모든 URL 에 대한 액세스권이 필요합니다. 액세스권이 없는 경우는, 코드 베이스 로더 대신에, 현재의 thread의 문맥 클래스 로더가 사용됩니다.

loadProxyClass 메소드는, 다음의 방법으로, 지정된 인터페이스의 동적 프록시 클래스를 돌려줍니다.

defaultLoader 인수가 null 이외로, 그 로더를 사용해 지정된 인터페이스를 모두 해결할 수 있는 경우

  • 해결된 인터페이스가 모두 public 의 경우는, 우선 Proxy.getProxyClass 를 사용해, 코드 베이스 로더로부터 그 인터페이스의 동적 프록시 클래스를 취득하려고 한다. IllegalArgumentException 가 throw 되었을 경우는,defaultLoader 로부터 그 인터페이스의 동적 프록시 클래스를 취득하려고 한다. 어느 쪽의 경우도 IllegalArgumentException 가 throw 되었을 때는,ClassNotFoundException 가 throw 된다. 다른 예외가 throw 되었을 경우, 그 예외는 호출해 측에 throw 된다
  • 해결된 인터페이스가 public 이외의 경우, 그것들이 모두 같은 클래스 로더에 정의되고 있을 때는, 그 로더로부터 그 인터페이스의 동적 프록시 클래스를 취득하려고 한다
  • 상기 이외의 경우는,LinkageError 가 throw 된다 (지정된 인터페이스를 모두 구현하는 클래스는 어느 로더에도 정의할 수 없기 때문에)

지정된 모든 인터페이스를 코드 베이스 로더를 사용해 해결할 수 있는 경우

  • 해결된 인터페이스가 모두 public 의 경우는, 그 인터페이스의 동적 프록시 클래스를 코드 베이스 로더로부터 취득하려고 한다. IllegalArgumentException 가 throw 되었을 경우는,ClassNotFoundException 가 throw 된다
  • 해결된 인터페이스가 public 이외의 경우, 그것들이 모두 같은 클래스 로더에 정의되고 있을 때는, 그 로더로부터 그 인터페이스의 동적 프록시 클래스를 취득하려고 한다
  • 상기 이외의 경우는,LinkageError 가 throw 된다 (지정된 인터페이스를 모두 구현하는 클래스는 어느 로더에도 정의할 수 없기 때문에)

상기 이외의 경우, 해결할 수 없었던 지정 인터페이스에 대해,ClassNotFoundException 가 throw 됩니다.

반환값:
디폴트의 서비스 프로바이더의 정규의 인스턴스
예외:
SecurityException - 시큐리티 매니저가 존재하는 경우에, 그 checkPermission 메소드 호출해에 실패했을 때
도입된 버젼:
1.4

getSecurityContext

@Deprecated 
public static Object  getSecurityContext(ClassLoader  loader)
추천 되고 있지 않습니다.  대체는 없습니다. Java 2 플랫폼 1.2 이후의 RMI 에서는, 클래스 로더의 시큐리티 문맥을 취득하기 위해서 이 메소드를 사용하지 않습니다

지정된 클래스 로더의 시큐리티 문맥을 돌려줍니다.

파라미터:
loader - 시큐리티 문맥의 취득원의 클래스 로더
반환값:
시큐리티 문맥
관련 항목:
SecurityManager.getSecurityContext()

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 도 참조해 주세요.