2011-11-02 2 views

답변

2

ClassLoader.getResourceAsInputStream()을 사용할 수 있지만로드 된 것과 동일한 바이트가 보장됩니다. 로드 된 실제 바이트가 어디에도 저장되지 않는다고 생각합니다.

2

내가 아는 표준 방법이 없습니다. 그러나 당신은 자신의 위임 클래스 로더를 구현하여 이름과 바이트 코드의 관점에서로드 된 클래스를 추적 할 수 있습니다.

당신의 사례는? - 원격 응용 프로그램으로 코드 전송?

2

ClassLoader 구현은 지원하는 Java 언어 사양 버전에 대한 클래스 표현을 변경해야합니다. 따라서 바이트 배열을 취하여 이것을 Class 객체로 변환하거나 일부 ClassLoader를 확장하는 로직을 포함해야합니다. 그러나 Java가 정의하는 추상 ClassLoader 클래스에는 클래스에서 byte []를 반환 할 수있는 메서드가 없습니다. 일부 구현체 (예 : 부트 스트랩, 시스템 또는 다른 클래스 로더)가있을 수 있지만 구현에 고유 한 것이고 의존할만한 것이 아닙니다.

당신이 이런 종류의 기능이 필요한 경우, 하나의 방법은 나중에 검색 할 수 있도록 입력 바이트 배열이 Class 객체에 매핑되는 방식에 defineClass 방법을 자신의 ClassLoader 구현을 작성하고 무시하는 것입니다해야 할 일 .

컴파일러가 소스 코드를 클래스 파일 (기본적으로 바이트 [])로 바꾸고 클래스 로더가 클래스 파일을 Class 개체로 변환하기 때문에 Class에서 byte []로 바로 이동하는 데 필요한 항목이 체인에 없습니다. 하지만 바이트 코드 위빙 (weaving), 런타임 바이트 코드 생성 (runtime byte code generation) 등을하는 것들을 사용하면 이것을 할 수있는 무언가를 발견 할 수 있습니다.

2

여기 BCEL으로 시도하는 뭔가 : 나는 당신의 질문을 읽고에 대한 답변을하기 전에 몰랐

JavaClass clazz = Repository.lookupClass("foo.bar.YourClass"); 
byte[] bytes = clazz.getBytes(); 

,하지만 그들은 Java class file format 지원하기 때문에, 나는 다음과 같은 라이브러리를 확인해야합니다 알고 :

  • BCEL
  • 와 Javassist
  • ASM

위의 방법으로 문제가 해결되지 않으면이 라이브러리에서 다른 것을 찾아보십시오.

관련 문제