Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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.lang.Object等待(long)本机方法_Java_Byte Buddy - Fatal编程技术网

拦截带有字节的java.lang.Object等待(long)本机方法

拦截带有字节的java.lang.Object等待(long)本机方法,java,byte-buddy,Java,Byte Buddy,我正在尝试记录“Object.wait”方法调用的计数。拦截“公共最终本机无效等待(长超时)”对于ByteBuddy无效。我做了一些测试: test1、test2打印错误:java.lang.IllegalStateException:无法为public调用超级(或默认)方法 wait(long,int)抛出java.lang.InterruptedException; java.lang.IllegalStateException:无法为公共最终本机void java.lang.Object调

我正在尝试记录“Object.wait”方法调用的计数。拦截“公共最终本机无效等待(长超时)”对于ByteBuddy无效。我做了一些测试:

test1、test2打印错误:java.lang.IllegalStateException:无法为public调用超级(或默认)方法 wait(long,int)抛出java.lang.InterruptedException; java.lang.IllegalStateException:无法为公共最终本机void java.lang.Object调用超级(或默认)方法。等待(长)抛出java.lang.InterruptedException

test3无效,不打印任何内容

测试4是成功

以下是我的测试代码:

Javaagent:


最终公共类代理bootstrap{
公共静态类测试{
@忠告,忠告
(@Advice.Origin String methodIns)之前的公共静态void{
System.out.println(“字节伙伴输入:+methodIns”);
}
@方法索引的建议
(@Advice.Origin String methodIns)之后的公共静态void{
System.out.println(“Byte Buddy after:+methodIns”);
}
}
公共静态void premain(String agentArgs,inst inst)引发异常{
AgentBuilder AgentBuilder=new AgentBuilder.Default()
.与(AgentBuilder.重新定义策略.重新转换)
.with(AgentBuilder.InitializationStrategy.NoOp.INSTANCE)
.with(AgentBuilder.TypeStrategy.Default.REBASE)
.enableNativeMethodPrefix($$mynative)
.with(AgentBuilder.Listener.StreamWriting.toSystemError().withErrorsOnly())
.with(AgentBuilder.InstallationListener.StreamWriting.toSystemError())
.ignore(nameStartsWith(“net.bytebuddy”);
//测试1(代理商制造商,inst);
//测试2(代理商制造商,inst);
//测试3(代理商制造商,inst);
//测试4(代理商制造商,inst);
}
/**
*截获方法:公共最终本机void等待(长超时)
*打印错误:java.lang.IllegalStateException:无法为公共最终本机void java.lang.Object调用超级(或默认)方法。等待(长)抛出java.lang.InterruptedException
*/
私有静态void test1(AgentBuilder AgentBuilder,Instrumentation inst)引发异常{
agentBuilder.disableClassFormatChanges()
.type(is(Object.class))
.transform(新变压器(){
@凌驾
公共生成器转换(生成器生成器生成器、TypeDescription TypeDescription、类加载器、类加载器、JavaModule模块){
返回builder.method(命名为(“wait”).and(takesArguments(1)).intercept(Advice.to(TestAdvice.class));
}
})
.installOn(inst);
inst.retransformClasses(Object.class);
}
/**
*截获方法:公共最终无效等待(长超时,int nano)
*打印错误:java.lang.IllegalStateException:无法为公共最终void java.lang.Object调用超级(或默认)方法。等待(long,int)抛出java.lang.InterruptedException
*/
私有静态void test2(AgentBuilder AgentBuilder,Instrumentation inst)引发异常{
agentBuilder.disableClassFormatChanges()
.type(is(Object.class))
.transform(新变压器(){
@凌驾
公共生成器转换(生成器生成器生成器、TypeDescription TypeDescription、类加载器、类加载器、JavaModule模块){
返回builder.method(命名为(“wait”).and(takesArguments(2)).intercept(Advice.to(TestAdvice.class));
}
})
.installOn(inst);
inst.retransformClasses(Object.class);
}
/**
*截获方法:公共最终本机void等待(长超时)
*无效,不打印任何内容
*/
私有静态void test3(AgentBuilder AgentBuilder,Instrumentation inst)引发异常{
agentBuilder.disableClassFormatChanges()
.type(is(Object.class))
.transform(新变压器(){
@凌驾
公共生成器转换(生成器生成器生成器、TypeDescription TypeDescription、类加载器、类加载器、JavaModule模块){
返回builder.visit(Advice.to(TestAdvice.class).on(命名为(“等待”)。和(takesArguments(1)));
}
})
.installOn(inst);
inst.retransformClasses(Object.class);
}
/**
*截获方法:公共最终无效等待(长超时,int nano)
*成功
*/
私有静态void test4(AgentBuilder AgentBuilder,Instrumentation inst)引发异常{
agentBuilder.type(is(Object.class))
.transform(新变压器(){
@凌驾
公共生成器转换(生成器生成器生成器、TypeDescription TypeDescription、类加载器、类加载器、JavaModule模块){
返回builder.visit(Advice.to(TestAdvice.class).on(命名为(“等待”)。和(takesArguments(2)));
}
})
.installOn(inst);
}
}
测试:

publicstaticvoidmain(字符串[]args)引发异常{
新线程(()->{
Object obj=新对象();
while(true){
试一试{
同步(obj){
对象等待(1000);
对象等待(1000,1);
}
}捕获(例外e){
e、 printStackTrace();
}
}
}).start();
}
:(Test4代码用于“public final void wait()”方法,它可以工作,但对“public final native void wait()”方法不起作用。我想知道如何拦截“public final native void wait()”方法。

免责声明:这不是最终答案,只是讨论所需的初步版本

事实上,我们谈论的是BB的一部分,我不知道,因为我也不是专家。但我很好奇,尝试了类似的东西

.transform((生成器、类型描述、类加载器、模块)->
建设者