|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
java.lang.Objectjava.rmi.server.RMIClassLoader
public class RMIClassLoader
RMIClassLoader
는, RMI 를 사용해 동적으로 클래스를 로드하기 위한 static 메소드로부터 구성됩니다. 이 클래스 로더에는, 네트워크의 장소 (1 개(살) 이상의 URL)에서 클래스를 로드하는 메소드나, 기존의 클래스가 포함되고 있는 장소를 취득하는 메소드가 짜넣어지고 있습니다. 이러한 메소드는, 원격 메소드 호출의 인수나 반환값에 포함되는 클래스를 정렬화 및 비정렬화할 때, RMI 런타임에 의해 사용됩니다. 또, 이러한 메소드를 어플리케이션으로부터 직접 호출해, 클래스를 동적으로 로드할 수도 있습니다.
다음의 static 메소드의 구현은, 이러한 서비스 프로바이더 인터페이스 RMIClassLoaderSpi
의 인스턴스에 의해 제공됩니다.
loadClass(URL, String)
loadClass(String, String)
loadClass(String, String, ClassLoader)
loadProxyClass(String, String[], ClassLoader)
getClassLoader(String)
getClassAnnotation(Class)
서비스 프로바이더 인스턴스는 다음과 같이 선택됩니다.
java.rmi.server.RMIClassLoaderSpi
가 정의되고 있는 경우, 그 값이 "default"
때는,getDefaultProviderInstance()
메소드 호출의 반환값으로 지정되고 있는 프로바이더 인스턴스가 선택된다. 이 시스템 프로퍼티이 "default"
이외의 값 때는, 시스템 클래스 로더 (ClassLoader.getSystemClassLoader()
를 참조)가 시스템 프로퍼티으로 지정되고 있는 클래스를 로드 할 수 있어 그 클래스를 RMIClassLoaderSpi
에 할당할 수가 있어 인수가 없는 public 생성자 을 가지는 경우, 프로바이더 인스턴스 작성시에 그 생성자 이 불려 간다. 이 시스템 프로퍼티이 정의되고 있는 경우에서도, 이러한 조건이 채워지지 않은 경우는,RMIClassLoader
를 사용을 시도하는 코드에 대해서, 프로바이더 인스턴스의 취득에 실패한 것을 나타내는, 지정되어 있지 않은 Error
가 throw 된다
META-INF/services/java.rmi.server.RMIClassLoaderSpi
라고 하는 자원이 짜넣어지고 있는 경우, 이 자원의 내용은 프로바이더의 구성 파일로서 해석되어 이 파일의 최초로 지정되고 있는 클래스명이 프로바이더의 클래스명으로서 사용된다. 시스템 클래스 로더가 그 이름을 가지는 클래스를 로드 할 수 있어 그 클래스를 RMIClassLoaderSpi
에 할당할 수가 있어 인수가 없는 public 생성자 을 가지는 경우는, 프로바이더 인스턴스 작성시에 그 생성자 이 불려 간다. 이 자원이 짜넣어지고 있어도, 프로바이더를 인스턴스화할 수 없는 경우는,RMIClassLoader
를 사용을 시도하는 코드에 대해서, 프로바이더 인스턴스의 취득에 실패한 것을 나타내는, 지정되어 있지 않은 Error
가 throw 된다
getDefaultProviderInstance()
메소드 호출의 반환값으로 지정되고 있는 프로바이더 인스턴스가 선택된다
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 |
메소드의 상세 |
---|
@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)
public static Class <? > loadClass(URL codebase, String name) throws MalformedURLException , ClassNotFoundException
codebase
가 null
인 경우, 이 메소드의 동작은,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
- codebase
가 null
로, 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException
- 클래스의 정의가 지정된 URL 에 없었던 경우public static Class <? > loadClass(String codebase, String name) throws MalformedURLException , ClassNotFoundException
이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.loadClass(String, String, ClassLoader)
메소드에 처리를 위양 합니다. 이 때,codebase
가 최초의 인수로서name
가 2 개째의 인수로서null
가 3 개째의 인수로서 건네받습니다.
codebase
- 클래스의 로드원의 URL 의 리스트 (단락 문자는 스페이스), 또는 null
name
- 로드 대상 클래스의 이름
Class
객체
MalformedURLException
- codebase
가 null
이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebase
가 null
로 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException
- 클래스의 정의가 지정된 장소에 없었던 경우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
- codebase
가 null
이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebase
가 null
로 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException
- 클래스의 정의가 지정된 장소에 없었던 경우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
- codebase
가 null
이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebase
가 null
로 한편 클래스의 로드시에 사용된 프로바이더 고유 URL 가 무효인 경우
ClassNotFoundException
- 지정된 인터페이스의 정의중 한쪽이 지정된 장소에 발견되지 않는 경우, 또는 동적 프록시 클래스의 작성에 실패했을 경우 (Proxy.getProxyClass(ClassLoader, Class[])
가, 지정된 인터페이스 리스트에 대해서 IllegalArgumentException
를 throw 했을 때 등)public static ClassLoader getClassLoader(String codebase) throws MalformedURLException , SecurityException
반환되는 클래스 로더는,loadClass(String, String)
메소드가 같은 codebase
인수를 지정해 클래스를 로드할 때 사용하는 클래스 로더와 같습니다.
이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.getClassLoader(String)
메소드에 처리를 위양 합니다. 이 때,codebase
가 인수로서 건네받습니다.
시큐리티 매니저가 존재하는 경우는,RuntimePermission("getClassLoader")
액세스권을 사용해 checkPermission
메소드가 불려 가SecurityException
가 체크됩니다. 이 메소드의 프로바이더 구현은, 호출측 문맥이 코드 베이스 URL 패스내의 모든 URL 에 대한 액세스권을 가지고 있을지 어떨지에 임해서, 시큐리티 체크를 실시하는 일도 있습니다.
codebase
- 반환되는 클래스 로더가 로드하는 클래스가 포함되고 있는 URL 의 리스트 (단락 문자는 스페이스), 또는 null
MalformedURLException
- codebase
가 null
이외로 한편 무효인 URL 를 포함하고 있는 경우, 또는 codebase
가 null
로 한편 클래스 로더의 식별시에 사용된 프로바이더 고유 URL 가 무효인 경우
SecurityException
- 시큐리티 매니저가 존재할 경우에, 그 checkPermission
메소드가 실패했을 경우. 또는, 호출측이 코드 베이스 URL 패스내의 모든 URL 에 대한 액세스권을 가지고 있지 않은 경우public static String getClassAnnotation(Class <? > cl)
이 메소드는, 프로바이더 인스턴스의 RMIClassLoaderSpi.getClassAnnotation(Class)
메소드에 처리를 위양 합니다. 이 때,cl
가 인수로서 건네받습니다.
cl
- 주석을 취득하는 대상의 클래스
null
NullPointerException
- cl
가 null
의 경우public static RMIClassLoaderSpi getDefaultProviderInstance()
RMIClassLoaderSpi
의 디폴트 프로바이더의 정규 인스턴스를 돌려줍니다. 시스템 프로퍼티 java.rmi.server.RMIClassLoaderSpi
가 정의되어 있지 않은 경우, 다음에 나타내는 RMIClassLoader
의 static 메소드는, 서비스 프로바이더 인스턴스로서 디폴트 프로바이더의 정규 인스턴스를 사용합니다.
loadClass(URL, String)
loadClass(String, String)
loadClass(String, String, ClassLoader)
loadProxyClass(String, String[], ClassLoader)
getClassLoader(String)
getClassAnnotation(Class)
시큐리티 매니저가 존재하는 경우,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
메소드 호출해에 실패했을 때@Deprecated public static Object getSecurityContext(ClassLoader loader)
loader
- 시큐리티 문맥의 취득원의 클래스 로더
SecurityManager.getSecurityContext()
|
JavaTM Platform Standard Ed. 6 |
|||||||||
앞의 클래스 다음의 클래스 | 프레임 있어 프레임 없음 | |||||||||
개요: 상자 | 필드 | 생성자 | 메소드 | 상세: 필드 | 생성자 | 메소드 |
Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms . Documentation Redistribution Policy 도 참조해 주세요.