我有很多Web服务在普通JDK上运行,我需要截取所有公共方法来做一些事情。有些方法正在使用@WebParam注释。用ByteBuddy子类化WebService会从覆盖方法中删除@WebParam注释,服务不再按预期工作。
这是签名样本
public Something fetch( @WebParam( name="Query" ) QueryCriteria query )
下面是我如何使用ByteBuddy
new ByteBuddy( )
.subclass( implementationClass )
.method( isPublic( ).and( isDeclaredBy( implementationClass ) ) )
.intercept(
MethodDelegation.to( new WebServiceInterceptor( ) )
.andThen( SuperMethodCall.INSTANCE ) )
.annotateType( implementationClass.getAnnotations( ) )
.make( )
我知道有一种注释参数的方法,但是它需要关于方法参数的特殊知识(因为只有一些参数被注释)。我想做的只是要求ByteBuddy以与超类完全相同的方式注释我的类,包括所有重写方法的所有参数。
subclass( implementationClass )
.annotateType( LIKE_SUPERCLASS )
.method( )
.intercept( ... )
.annotateMethod( LIKE_SUPER_INCLUDING_PARAMS )
有什么想法吗?
比尔,帕西
我自己设法找到了解决办法。
new ByteBuddy( )
.withAttribute( new TypeAttributeAppender.ForInstrumentedType( AnnotationAppender.ValueFilter.AppendDefaults.INSTANCE ) )
.withDefaultMethodAttributeAppender( new MethodAttributeAppender.ForInstrumentedMethod(AnnotationAppender.ValueFilter.AppendDefaults.INSTANCE ) )
我会成功的。
比尔,帕西
线程“main”java.lang.LinkageError:loader(sun/misc/launcher$AppClassLoader的实例):试图重复名称:“TestClass”的类定义 我正在尝试实现代理,如:easly-create-java-agents-with-bytebuddy中描述的示例所示 是否有一种方法可以加载Class对象而不导致此问题,或者使用传递给transform
上面的getMetadataReader方法调用最终以 它使用ASM ClassReader访问类和注释元数据。这显然找不到ByteBuddy放置的@Entity注释。 我不确定我是否应该以某种方式将Classloader链接到Bytebuddy中,或者重写Springs SimpleMetadataReader,以使我自己的实现得到Bytebuddy的支持。 让我知道如果你想要更多的实现细节。我
让我有一个这样的界面: 还有这样一个实现类: 现在我想使用bytebuddy创建一个拦截器/代理,它捕捉对setter的调用,存储更改后的值,并调用real方法。 最后,我想向拦截器/代理“询问”被调用的setter和更改的值。 我尝试了很多考虑也教程,但到目前为止,我发现没有工作的解决方案。也许有人可以帮助我。 这是拦截器: 以下是我当前的“测试”代码: 编辑:
理解DLL 首先我们需要知道我们在启动一个程序的时候并没有把所有的需要用到的数据或者文件运行起来,而是只运行了关键部分,那么当我们需要调用到某一功能时再通过DLL来动态链接,不需要时就可以卸载,使得程序不显得臃肿。 DLL注入是什么 DLL注入就是将代码插入/注入到正在运行的进程中的过程。我们注入的代码是动态链接库(DLL)的形式。为什么可以做到这一点?因为DLL(如UNIX中的共享库)是在运行时
和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?
我一直在使用字节好友来监控应用程序的行为,我想在执行特定方法之前检查其中一个应用程序类的数组字段是否已更新。我已经阅读了字节好友留档和堆栈溢出问题,并找到了一些有用的留档,了解如何使用拦截字段访问。 然而,因为我感兴趣的领域是一个数组,中的和事件似乎无关紧要。 是否可以使用ByteBuddy跟踪数组字段的更新?