2011-08-04 9 views
3

내 목표는 런타임에 클래스 파일의 위치를 ​​구체적으로 모르는 채로 클래스의 바이트 코드를 나타내는 byte []에 액세스하는 것입니다.클래스 바이트에 액세스 하시겠습니까?

두 가지 솔루션을 살펴본 결과 중 하나에서 약간의 성공을 거둘 수 있었지만 다른 방법으로 구현할 수 있는지 궁금한 점이있었습니다. 일하러 간다.)

첫 번째 (약간) 성공적인 해결책은 java.lang.instrumentation ClassFileTransformer 클래스를 사용하여 클래스의 byte []에 액세스하는 것이 었습니다. 이 workek, 나는 이것을 달성하는 더 깨끗한 방법이 있어야한다고 생각했다.

두 번째 해결책은 -Xbootclasspath JVM 인수를 사용하여 java.lang.ClassLoader를로드 한 클래스의 byte []에 액세스 할 수 있도록 내 자신으로 대체하는 것이 었습니다. 간단한 System.out.println 디버그 메시지를 추가하여 ClassLoader의 재정의가 작동하는지 확인했지만 실제로는 그렇지 않습니다. 나는 같은 주제에 대해 this paper에서이 아이디어를 얻었다. 내 수업은 Linked Paper에서 Integer 클래스가 다시 작성된 것과 비슷하게 만들어졌습니다. 나는 또한이 같은 뭔가를 찾고 JVM 인수 유사한 디렉토리 설정을 사용 :

java -Xbootclasspath/p:.\out\production\boot\java\lang TestLoader 

내 생각이 클래스 로더 클래스는 특별히 내가 링크 된 종이의 방법을 사용하여 오버라이드 (override) 할 수 없다는 것입니다.

ClassLoader를 재정의하려는 내 시도가 작동하지 않는 이유와 클래스의 바이트 []에 액세스하기 위해 수행 할 수있는 다른 작업을 듣는 것이 흥미 롭습니다.

+1

* * 아니, 그건에 전략이다 "내 목표는 바이트 [] 클래스의 바이트 코드를 나타내는 액세스 할 수있다" 이름없는 목표를 달성하십시오. 어떤 * 기능 * (즉,목표) 당신은 이것의 무엇이든을해서 최종 사용자에게 제안하고 싶은가? –

+0

이것은 교육적인 질문 일 뿐이므로 나는이 전략을 활용할 필요가있는 제품을 개발하지 않을 것입니다. – mburke13

답변

4

그냥 같이 getResourceAsStream을 사용하여 클래스의 바이트를 읽을 수 있습니다()?

InputStream is = String.class.getResourceAsStream("String.class"); 

편집 추가 대안 :

(코멘트에서 복사)

ClassFileTransformerinstrumentation API가 갈 수있는 방법이 될 수도, 적용 할 필요가있는 모든 가능성을 감안할 때. "깨끗한"요구 사항이 무엇인지 모르겠지만 문제가 JVM에 명령 줄 인수를 지정해야하는 경우 Attach API을 사용해 볼 수 있습니다. 이미 실행중인 Java 프로세스에 연결할 수 있으며 ClassFileTransformer, JVM에 이미로드 된 모든 클래스와 이후에로드되는 클래스를 살펴보십시오.

+0

그럴 수도 있겠지만, 나는 런타임에 클래스 파일에 직접 액세스 할 수 없다는 것을 분명히하지 않았을 수도 있습니다. – mburke13

+0

@Matt 질문에서 지정한 두 솔루션 모두 런타임에 클래스 파일에 액세스합니다. '런타임에 클래스 파일에 액세스 할 수 없음'(즉석에서 생성 된 바이트 코드, 사용자 정의 클래스 로더, 다른 것 등)에 대해 명확히 설명해 주시겠습니까? – prunge

+0

JVM에로드 된 모든 클래스의 byte [] 표현에 액세스 할 수 있기를 원합니다. 일부 클래스 (예 : String.class)는 이름을 알고 있지만 다른 이름은 알 수 없습니다. 또한 클래스 파일은 연결을 통해로드하거나 동적으로 생성하여 로컬 시스템에 있거나 없을 수 있습니다. 커버 할 수있는 범위가 너무 넓어서 유감이지만, 설명하려고 할 때, 나는이 모든 가능성을 다룰 수있는 방법이 있는지 알아내는 데 관심이 있습니다. – mburke13

0

내가 찾을 수있는 유일한 설명은 프랑스어이지만 코드는 여전히 Java에 있습니다. : 클래스 로더를 구축하고 클래스 파일에서 바이트를 얻을 수있는 좋은 아이디어를 제공하는 방법을

http://www.google.ca/url?sa=t&source=web&cd=2&ved=0CCEQFjAB&url=http%3A%2F%2Fdeptinfo.unice.fr%2F~renevier%2Farchilog%2Fcours02-chargementDynamique-4p.pdf&rct=j&q=jvm%20define%20class%20loader&ei=Bv05ToKZFcaksQLSs-TDAg&usg=AFQjCNHnjhZbR-A1KWRppvyBP3n_XbrdMA

페이지 1-8 설명합니다.

감사합니다, 스테판

0

나는 부팅 클래스 경로가 잘못되었다고 생각합니다. 클래스 로더의 클래스 파일이 가정 것을 :

.\out\production\boot\java\lang\ClassLoader.class 

당신은 사용해야

java -Xbootclasspath/p:.\out\production\boot TestLoader 
관련 문제