我试图拦截对JavaFX的调用'使用ByteBuddy 1.4.26的ScenePulseListener.pulse()
方法。
以下代码似乎正确引用此类和方法,并且拦截器的方法签名似乎是正确的,因为篡改了正确的触发器异常。
(在加载installJavaFXPulseInterceptor()
类之前调用ScenePulseListener
。)
然而,当ScenePulseListener.pulse()
出现时,永远不会调用拦截器方法:我做错了什么?
public static class PulseInterceptor
{
public static void interceptPulse( @SuperCall final Callable< Void > pSuper )
throws Exception
{
pSuper.call();
}
}
public static final void installJavaFXPulseInterceptor()
{
final TypePool type_pool= TypePool.Default.ofClassPath();
(new ByteBuddy())
.rebase( type_pool.describe( "javafx.scene.Scene$ScenePulseListener" ).resolve(),
ForClassLoader.ofClassPath() )
.method( named( "pulse" ) )
.intercept( MethodDelegation.to( PulseInterceptor.class ) )
.make()
.load( ClassLoader.getSystemClassLoader(), ClassLoadingStrategy.Default.INJECTION );
}
答案 0 :(得分:0)
您不应该使用此方法,因为在尝试注入类型时无法保证类尚未加载。这实际上只有在代码之前没有加载任何内容时才有效,即在调用main
方法之后直接加载。
理想情况下,您应该为此类转换定义Java代理。
您可以通过定义类来验证拦截器:
public class Foo {
public void pulse() {
System.out.println("foo");
}
}
看看你的转型是否有效。确保在转换之前不加载类。在我的机器上执行此操作,表明您的代码示例已经加载。
您确定系统类加载器正在加载您的JavaFx类吗? Pulse.class.getClassLoader()
说什么?