내 계측 도구 용으로 특정 클래스를 계측 한 후 주 메서드를 시작하는 데 사용되는 래핑 ClassLoader를 제공하려고합니다. ClassLoader는 계측 된 특정 클래스의 버전을로드해야합니다. 그러나 Jetty와 JUnit의 경우 이러한 접근 방식은 자체적 인 클래스 로딩 계층 구조를 만들기 때문에 많이 제한됩니다.SystemClassLoader에 클래스를로드 할 때 클래스로드 순서를 어떻게 결정합니까?
VM 인수를 전달하고 싶지 않아 SystemClassLoader를 변경할 수 없습니다. 하지만 반성을 통해 ClassLoader.defineClass(String, byte[], int, int)
을 공개하여 클래스와 강제로 연결할 수 있습니다.
ClassLoader scl = ClassLoader.getSystemClassLoader();
Method defineClass = ClassLoader.class.getDeclaredMethod(
"defineClass", String.class, byte[].class, int.class, int.class);
defineClass.setAccessible(true);
for (String binaryName : classNamesToLoad) {
byte[] bytecode = this.declaredClasses.get(binaryName);
defineClass.invoke(scl, binaryName, bytecode, 0, bytecode.length);
}
defineClass.setAccessible(false);
이 그냥 좋은 -하지만 왼쪽 한 가지 문제가있다 : 내 수업의 일부가 다른 클래스에서 상속이나 포함되어있는 경우, 그들은 올바른 순서로로드 할 수있는에 SystemClassLoader로드 때문에 현재에 의존하는 모든 클래스 - 계측되지 않은 버전을로드합니다.
A
A.A extends B.A
B
B.A extends B.C
B.C
내가 원하는 경우 순서
B
B.C
B.A
A
A.A
에로드되어야 할 것이다 : 여기
몇 가지 (가난라는 이름의) 클래스와 그들이 가지고있는 것 순서로로드 할과 예입니다 인스 트루먼 테이션 된 버전 만로드하십시오.쉬운 방법이 있습니까? 예 : "setSystemClassLoader"메소드는 아직 발견하지 못했습니까?
SystemClassLoader를 조작 할 필요가없는 해결 방법은 무엇입니까?
또는 올바른 순서를 결정하기 위해로드하려는 클래스에서 전체 전이 의존성 분석을 실제로 수행해야합니까 (이 경우에는 어떤 "선행 기술"을 사용할 수 있습니까)?
감사합니다.
나는 그렇게 할 수 없다. instanceof 클래스 (클래스가 아닌 버전)를로드하고 더 이상 클래스 로더에서 내 버전을로드 할 수 없습니다. – Arne