java - Byte Buddy installOn API 给出错误 : adding retransformable transformers is not supported?

标签 java spring-boot bytecode byte-buddy

为什么 installOn API 在我的代码中出现错误。我想从另一个线程调用instrumentation.retransformClasses API。 或者我们可以在bytebuddy中调用instrumentation.retransformClasses API吗? 我想在类加载后插入一个静态字段。如果可能的话,一个简短的例子就太好了!

public static void premain(String arguments, Instrumentation instrumentation) {

    System.out.println("Agent for add fields ");
    final ByteBuddy byteBuddy = new ByteBuddy().with(Implementation.Context.Disabled.Factory.INSTANCE);
    new AgentBuilder.Default()    
              .with(byteBuddy).with(RedefinitionStrategy.RETRANSFORMATION)
              .with(new AgentBuilder.InitializationStrategy.SelfInjection.Eager())
              .with(TypeStrategy.Default.REDEFINE)
              .type((ElementMatchers.nameContains("Method")))
              .transform(new Transformer() {
                   public Builder<?> transform(Builder<?> arg0, TypeDescription arg1, ClassLoader arg2,
                            JavaModule arg3) {
                        // TODO Auto-generated method stub
                        return null;
                    }
                })
              .installOn(instrumentation);

    Thread thread = new Thread() {
        public void run() {
            System.out.println("Thread Running");
            try {
                Thread.currentThread().sleep(10000);

                Class c[] = instrumentation.getAllLoadedClasses();
                for (int i = 0; i < c.length; i++) {
                    String clsName = c[i].getName();

                    System.out.println(clsName);
                    if (clsName.equals("com.github.shehanperera.example.Method")) {

                            instrumentation.retransformClasses(c[i]);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println(e);
            }

        }
    };

    thread.start(); 
}

给出异常(exception):

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.IllegalStateException: Could not install class file transformer
    at net.bytebuddy.agent.builder.AgentBuilder$Default.installOn(AgentBuilder.java:8538)
    at net.bytebuddy.agent.builder.AgentBuilder$Default$Delegator.installOn(AgentBuilder.java:10179)
    at com.github.shehanperera.addfield.Agent.premain(Agent.java:39)
    ... 6 more
Caused by: java.lang.UnsupportedOperationException: adding retransformable transformers is not supported in this environment
    at sun.instrument.InstrumentationImpl.addTransformer(InstrumentationImpl.java:88)
    at net.bytebuddy.agent.builder.AgentBuilder$Default.installOn(AgentBuilder.java:8514)
    ... 8 more
FATAL ERROR in native method: processing of -javaagent failed

最佳答案

Javassist 默认情况下不允许类似的事情,javassist 只是做了简单的巧妙技巧,并允许您在实际加载类之前对其进行编辑,因为类是在第一次使用时加载的。否则,也必须使用具有重新转换功能的典型代理。

要创建可以重新转换类的工具,您必须添加适当的标志来 list :
可以重新转换类:true

https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html

关于java - Byte Buddy installOn API 给出错误 : adding retransformable transformers is not supported?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60284138/

相关文章:

java - 使用java swings删除选定的复选框而不使用Jtable/Database

java - Spring : Could not determine type for: java. util.List

java - Java字节码指令组合对操作数栈的影响

java - @KafkaListener 不会读取以前的消息,即使它们没有被确认,除非应用程序重新启动

java - Spring Boot Web 应用程序无法在 Tomcat 上运行 - 404 错误

python - 是否可以在不使用 co_code 的情况下获取 python 字节码?

java - 为什么Java要进行字节码校验?

java - 如何设置 java.util.Date 的偏移量?

java - 使用 cookie 在 Spring-MVC 中使用 ICU 进行本地化

java - 在 Java 中清理错误的 XML