2016-11-04 2 views
2

ByteBuddy를 사용하여 String.class 또는 Integer.class와 같은 java.lang 패키지의 클래스를 재정의하려고했지만 성공하지 못했습니다. 그게 가능하다면 제 질문이 있습니까?ByteBuddy를 사용하여 java.lang 클래스 다시 정의

[Byte Buddy] IGNORE [[Ljava.lang.String; [null, null] 
[Byte Buddy] COMPLETE [[Ljava.lang.String; [null, null] 

않습니다

public static void premain(String agentArgs, Instrumentation inst) { 
    new AgentBuilder.Default() 
      .type(named("java.lang.String")) 
      .transform((builder, typeDescription, classLoader) -> 
        builder.method(named("toString")) 
          .intercept(FixedValue.value("toString() got hacked!"))) 
      .with(AgentBuilder.Listener.StreamWriting.toSystemOut()) 
      .with(AgentBuilder.RedefinitionStrategy.REDEFINITION) 
      .with(AgentBuilder.TypeStrategy.Default.REDEFINE) 
      .installOn(inst); 
} 

나는 로그의 출력과 제가 String 클래스에 대한 참조입니다 확인하는 경우 :

내가 내 자바 에이전트에 노력하고있어 코드 이것은 ByteBuddy가 String 클래스를 재정의하지 않는다는 것을 의미합니까? 그게 가능한가?

감사합니다.

답변

2

예, Byte Buddy는 모든 클래스를 재정의 할 수 있지만 기본적으로 부트 스트랩 클래스는 무시됩니다. 당신은 정의를 정의하여이 기본 설정을 재정의 할 수 있습니다 정규 무시하거나 alltogether를 제거 :

AgentBuilder agentBuilder = new AgentBuilder.Default().ignore(none()); 

내가 그러나 강하게 부트 스트랩 클래스와 특히 String 클래스와 장난에 당신을 조언한다. 많은 코드가 toString 클래스에 대해 강력한 가정을합니다.

.disableClassFormatChanges() 옵션을 사용해야하는 이유 때문에 대부분의 JVM에서는 클래스를 재정의 할 때 클래스 파일 형식을 변경할 수 없습니다. 그렇게하면 표준 인터셉터 대신에 Advice 클래스를 사용할 때의 메소드 나 필드를 더 이상 추가 할 수 없습니다.

관련 문제