当前位置: 首页 > 知识库问答 >
问题:

使用Byte Buddy进行检测时出现的问题

通安宁
2023-03-14

我有Byte Buddy作为代理运行,它成功地拦截了我的绝大多数代码库,顺便说一下,这是相当大的!虽然有几个异常值,我不能测量,我在下面记录,希望你能知道答案!

1.CGLIB生成的类

Spring生成了一些额外的类,它们与我的类同名,但在末尾附加了“$$EnhancerByCglib$$”,这些会导致错误。我得到的错误是:

java.lang.IllegalStateException: Cannot resolve type description for com.mycompany.MySpringBean$$EnhancerByCGLIB$$ee9d3c37_2
at net.bytebuddy.pool.TypePool$Resolution$Illegal.resolve(TypePool.java:152)
at net.bytebuddy.pool.TypePool$LazyFacade$LazyResolution$LazyTypeDescription.resolve(TypePool.java:3158)
at net.bytebuddy.pool.TypePool$LazyFacade$LazyResolution$LazyTypeDescription.getModifiers(TypePool.java:3238)
at net.bytebuddy.ByteBuddy.rebase(ByteBuddy.java:697)
.and(not(nameContains("EnhancerByCGLIB")))

2.打包私密类和私密类

我看到的另一个问题是检测包私有私有类

Package Private代码如下所示:

abstract class BaseBean {
    Object methodA(final String customerNumber){}
}
Caused by: java.lang.IllegalAccessException:
    Class net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField cannot 
    access a member of class com.mycompany.BaseBean with modifiers "public static"
public class Object A {
 //variables & methods...
 private class ObjectB {}
}
Caused by: java.lang.IllegalAccessException:
    Class net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField cannot 
    access a member of class com.mycompany.ObjectA$ObjectB with modifiers "public static"

Byte Buddy instrument可以打包私有私有类吗?

3.静默失败

这只是一个一般性的问题,但是否可以指示Byte Buddy在每个类上默默无闻地失败?这样,任何此类错误都不会阻止应用程序启动,也不会阻止Byte Buddy尽可能多地检测。

package com.mycompany;
public interface InterfaceA{
    Object provideAccess(final String id);
}

package com.mycompany;
public abstract class BaseBeanA implements InterfaceA { 
  //some general helper methods
}

package com.mycompany;
public abstract class BaseBeanB extends BaseBeanA { 
    //some specific helper methods
}

package com.mycompany;
public class BeanImpl extends BaseBeanB {   
    protected Object provideAccess(final String id) {
    }
}

这会导致检测BaseBeanB时出现以下错误:

java.lang.IllegalArgumentException:无[protected void java.lang.Object.Finalize()抛出java.lang.Throwable,public final native void java.lang.Object.Wait(长)抛出java.lang.InterruptedException,public final void java.lang.Object.Wait()抛出java.lang.InterruptedException,public final void java.lang.Object.Wait(长,int)抛出用于从公共抽象对象com.mycompany.interface.ProvideAccess(java.lang.String)委派

共有1个答案

邹学民
2023-03-14

1.CGLIB生成的类

你的解决方案是正确的。事实上,按名称指定类对性能总是有好处的。例如,如果您可以排除整个包,那么Byte Buddy甚至可以丢弃类,而无需解析类文件,因为类名是单独可用的。

cglib生成的类的检测失败的原因是这些类没有可用的字节代码。

3.静默失败

如果检测失败,则总是将此失败报告给AgentBuilder.Listener。除此之外,失败没有任何影响,因为ClassFileTransformerAPI暗示了它。您是否观察到传递的任何异常?您可能还希望查看侦听器AgentBuilder的最新版本,在该版本中,侦听器AgentBuilder进行了重大重构。

4.公共抽象类中的公共方法

 类似资料:
  • 我试图测试一个基于Spring引导的Restendpoint。代码能够返回预期的输出,但测试失败,错误如下: 已解析[org.springframework.http.converter.HttpMessageNotWritableException:预设内容类型为“null”的[class java.util.LinkedList]没有转换器 对此有任何想法都将不胜感激! 下面是相同的代码: 控

  • 我试图用codeception运行一些测试,当我尝试测试表单时,总是失败,我不知道为什么。和其他人一样,他们都通过了。测试代码如下: 当我用命令运行测试时/vendor/bin/run-vvv--html--debug我有以下日志: 接受。一套yml就是这个: 演员:验收员 模块: 什么是错的?我想要的是测试表格,看看下一页写的假期,为什么一些测试通过了,一个简单的表格没有?。你能帮我个忙吗?

  • 我一直在努力使用REST API响应处理Firebase响应。问题是我不想在Firebase中使用Android的libs,而是使用原始rest api。长话短说,Firebase的回应是: 改装接口: Gson Builder、改装Builder和RxJava: 执行此操作时,我会得到错误: 为了迭代来自服务器的对象列表,是否可以使用RxJava解决这个问题?从现在起,我期待一个数组,但fire

  • 我正在尝试使用GPU而不是CPU运行dl4j模型。该模型使用CPU运行良好。所以我决定尝试CUDA来利用我的GPU。我遵循了这里描述的每个步骤,对于CUDA安装,我按照NVIDIA的说明从这里安装CUDA工具包。代码编译正常,但出现错误: 我的项目是使用IntelliJ上的Maven创建的。所有的依赖项都是可以的,否则代码将无法编译。必须缺少某些后端依赖项、库或安装。可能是版本不兼容的问题 消息为

  • 嗨,我在java 8中运行外部进程有问题。基本上,我可以从我的java代码运行ffplay,如果外部进程有子进程,似乎.毁()方法不起作用。 我的代码是:'' ''但即使在执行销毁()和强制销毁()之后,ffplay窗口仍保持打开状态。我试着使用Runtime。getRuntime()。执行官(……)而不是ProcessBuilder,在本例中,销毁方法似乎会关闭ffplay窗口。但我不知道如何在