Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有osgi容器的bytebuddy_Java_Osgi_Javaagents_Byte Buddy - Fatal编程技术网

Java 带有osgi容器的bytebuddy

Java 带有osgi容器的bytebuddy,java,osgi,javaagents,byte-buddy,Java,Osgi,Javaagents,Byte Buddy,试图基于bytebuddy主页上的示例编写一个简单的java代理。我让代理工作,但当我使用OSGI运行时运行它时,它抛出java.lang.NoClassDefFoundError 有什么建议吗 java.lang.ClassNotFoundException: com.foo.javaagent.TimingInterceptor cannot be found by .. import net.bytebuddy.implementation.bind.annotation.Origi

试图基于bytebuddy主页上的示例编写一个简单的java代理。我让代理工作,但当我使用OSGI运行时运行它时,它抛出java.lang.NoClassDefFoundError

有什么建议吗

java.lang.ClassNotFoundException: com.foo.javaagent.TimingInterceptor cannot be found by ..


import net.bytebuddy.implementation.bind.annotation.Origin;
导入net.bytebuddy.implementation.bind.annotation.RuntimeType;
导入net.bytebuddy.implementation.bind.annotation.SuperCall;
导入java.lang.reflect.Method;
导入java.util.concurrent.Callable;
公共类定时接收器{
@运行时类型
公共静态对象截获(@Origin Method,
@超级调用(可调用)引发异常{
长启动=System.currentTimeMillis();
试一试{
返回callable.call();
}最后{
System.out.println(方法+“take”+(System.currentTimeMillis()-start));
}
}
}

插入指令的类引用了
TimingInterceptor
类,因此必须可见。OSGi通过类加载器隔离类,并且不将系统类加载器设置为加载代理的父级。为了避免这种情况,您需要将类注入到引导类装入器中,在那里它们是通用可见的。为此,在一个单独的jar中隔离您的拦截逻辑,并通过用于安装代理的
Instrumentation
实例将此jar连接到引导类加载器搜索路径。您需要在安装代理之前执行此操作。

插入指令的类引用了
TimingInterceptor
类,因此必须可见。OSGi通过类加载器隔离类,并且不将系统类加载器设置为加载代理的父级。为了避免这种情况,您需要将类注入到引导类装入器中,在那里它们是通用可见的。为此,在一个单独的jar中隔离您的拦截逻辑,并通过用于安装代理的
Instrumentation
实例将此jar连接到引导类加载器搜索路径。您需要在安装代理之前执行此操作。

Rafael-非常感谢您的快速响应。你写了一个很棒的图书馆。我能让它工作。有没有关于如何修改方法输入参数的例子,HTTP拦截器和byte buddy?Rafael-非常感谢您的快速响应。你写了一个很棒的图书馆。我能让它工作。有没有关于如何修改方法输入参数、HTTP拦截器和byte buddy的示例?
import net.bytebuddy.agent.builder.AgentBuilder;
import net.bytebuddy.implementation.MethodDelegation;
import net.bytebuddy.matcher.ElementMatchers;
import java.lang.instrument.Instrumentation;


    public class TimerAgent {
        public static void premain(String arguments,
                                   Instrumentation instrumentation) {
            new AgentBuilder.Default()
                    .type(ElementMatchers.nameEndsWith("World"))
                    .transform((builder, type, classLoader, module) ->
                            builder.method(ElementMatchers.any())
                                    .intercept(MethodDelegation.to(TimingInterceptor.class))
                    ).installOn(instrumentation);
        }
    }
import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;

import java.lang.reflect.Method;
import java.util.concurrent.Callable;


public class TimingInterceptor {
    @RuntimeType
    public static Object intercept(@Origin Method method,
                                   @SuperCall Callable<?> callable) throws Exception {
        long start = System.currentTimeMillis();
        try {
            return callable.call();
        } finally {
            System.out.println(method + " took " + (System.currentTimeMillis() - start));
        }
    }
}