2011-03-29 5 views
9

설명서를 읽었지만 인수로 제공해야하는 클래스 로더를 이해하지 못합니다. 몇 가지 옵션을 시도했지만이 컴파일 또는 프록시 동작에 영향을 미치지 않는 것 같습니다. null을 포함하여 클래스 로더 인수로 아무 것도 전달할 수 없으며 코드가 제대로 작동합니다. 아무도 이것을 설명 할 수 클래스 로더에 대한 나쁜 인수를 제공하면 어떤 종류의 오류가 발생할 수 있습니다 말해 줄래? Java 또는 일반적으로 클래스 로더가 무엇인지에 대해 직관적 인 아이디어를 갖고 있지는 않다고 덧붙여 야합니다.Proxy.newProxyInstance (...)에 어떤 ClassLoader를 제공해야합니까?

답변

6

모든 클래스에는 클래스 로더가 있어야하므로 여기에 하나씩 부여해야합니다.

인터페이스 유형의 모든 지정된 클래스 로더를 통해 이름으로 볼 수 있어야합니다 :

중요한 부분이 (the documentation for getProxyClass()에)입니다. 즉, 클래스 로더 (CL) 모든 인터페이스 난에 대한 는 다음과 같은 표현이 충족되어야합니다 그래서

Class.forName(i.getName(), false, cl) == i 

, 당신은 부모 클래스 로더의 하나 (또는 ​​그 이상)가 주어진 정의 된 클래스 로더를 사용할 수 있습니다 인터페이스.

귀하의 케이스에서 null이 작동하는 경우 인터페이스에 null 클래스 로더 (부트 스트랩 로더)가 있다고 가정합니다. 그러면 어떤 클래스 로더를 사용했는지는 중요하지 않습니다. 알지 못하는 인터페이스로 프록시를 생성해야한다면 주어진 인터페이스의 클래스 로더를 가져 와서 호출자가 이상한 일을하지 않았 으면 좋겠다.

왜 필요한가요?

이처럼 상상할 수 : 모든 인터페이스의 모든 메소드를 구현하는 새로운 클래스에 대한 몇 가지 바이트 코드 (아직 존재하지 않는 경우)

  • getProxyClass() 방법은 생성 (이들 각각은 단순히 전달 InvocationHandler으로 전화).
  • 그런 다음이 바이트 코드를 지정한 클래스 로더의 defineClass 메소드로 전달합니다.
  • 이 바이트 코드에서 모든 인터페이스는 이름으로 참조되며, 이제 VM은 인용 된 forName 호출을 사용하여 이러한 인터페이스를 해결합니다.
대신 기존를 재사용 할 수있는의 그것을 위해 우리는 어떤 VM 마법없이 순수 자바이 getProxyClass이 방법을 구현 한 수 있지만, 우리는 (부모로 지정된 하나) 새로운 클래스 로더를 만들어야합니다

하나. VM이

+0

감사합니다 :-) 여기에 내부 마법을 사용할 수 있기 때문에

현실에서,이 합성 클래스의 실제 바이트 코드가되지 않을 수도 있습니다, 난 여전히 클래스 로더가하는 일에 대한 직관이없는 . 이것에 대해 조금 언급 할 수 있습니까? 클래스 로더가 아무 것도하지 않는 것에 대한 책임이있는 경우 null 클래스 로더가 작동 할 수있는 이유를 이해하는 데 여전히 어려움이 있습니다. 어쩌면 부정확 한 클래스 로더가 주어지는 장난감 예제일까요? – jonderry

+0

'null' 클래스 로더는 "클래스", "Object", "ClassLoader"와 같은 핵심 클래스를로드하는 클래스 로더 인 "부트 스트랩 클래스 로더"입니다. VM에 의해 네이티브로 구현되어 ClassLoader 객체를 가지지 않습니다. (이것은'Class에 의해 사용됩니다.'ClassLoader' 인수로서'null '을 지정하면 (자), 예를 들어 forName가됩니다. (예는 나중에 나옵니다.) –

관련 문제