Mule ByteBuddy 1.10.2抛出'java.lang.IllegalStateException:无法解析java.lang.Exception'的类型描述,以及类似的问题

Mule ByteBuddy 1.10.2抛出'java.lang.IllegalStateException:无法解析java.lang.Exception'的类型描述,以及类似的问题,mule,byte-buddy,byteman,Mule,Byte Buddy,Byteman,在安装AgentBuilder转换以进行检测时,我发现无法解决AgentBuilder.Listener.onError(…)中的类型描述错误 代理代码为: public static void premain(最终字符串代理、最终仪表安装){ System.out.println(“来自bytebuddy:代理premain”); new AgentBuilder.Default(new ByteBuddy().with(TypeValidation.DISABLED)) .disableCl

在安装
AgentBuilder
转换以进行
检测时,我发现
无法解决
AgentBuilder.Listener.onError(…)
中的类型描述
错误

代理代码为:

public static void premain(最终字符串代理、最终仪表安装){
System.out.println(“来自bytebuddy:代理premain”);
new AgentBuilder.Default(new ByteBuddy().with(TypeValidation.DISABLED))
.disableClassFormatChanges()
.ignore(无())
.with(重新定义策略。重新转换)
.with(InitializationStrategy.NoOp.INSTANCE)
.with(TypeStrategy.Default.redefinite)
.with(new AgentBuilder.Listener()){
public void onDiscovery(最终字符串类型名、最终类加载器类加载器、最终JavaModule模块、最终布尔加载){
日志(“事件::onDiscovery”(“+typeName+”、“+getNameId(classLoader)+”、“+module+”、“+loaded+”));
}
public void onTransformation(final TypeDescription TypeDescription、final ClassLoader ClassLoader、final JavaModule module、final boolean loaded、final DynamicType DynamicType){
日志(“事件::onTransformation”(“+typeDescription.getName()+”,“+getNameId(classLoader)+”,“+module+”,“+loaded+”,“+dynamicType+”));
}
public void onIgnored(final TypeDescription TypeDescription,final ClassLoader ClassLoader,final JavaModule module,final boolean loaded){
日志(“事件::onIgnored(“+typeDescription.getName()+”、“+getNameId(classLoader)+”、“+module+”、“+loaded+”));
}
public void onError(最终字符串类型名、最终类加载器类加载器、最终JavaModule模块、最终布尔加载、最终可丢弃){
日志(“事件::onError”(“+typeName+”、“+getNameId(classLoader)+”、“+module+”、“+loaded+”),可丢弃);
}
public void onComplete(最终字符串类型名、最终类加载器类加载器、最终JavaModule模块、最终布尔加载){
日志(“事件::onComplete(“+typeName+”、“+getNameId(classLoader)+”、“+module+”、“+loaded+”));
}
})
.type(hasSuperType(命名为(“com.ning.http.client.AsyncHttpClientConfig$Builder”))
.transform(新变压器(){
公共DynamicType.Builder转换(最终DynamicType.Builder,最终
System.out.println(“来自bytebuddy:transform”);
类型描述类型描述,最终类加载器类加载器,最终JavaModule模块){
返回builder.visit(Advice.to(AHCBuilderExit.class).on(isDefaultConstructor());
}})
.installOn(inst);
}
这是使用ByteBuddy v1.10.2和Mule 4(jdk1.8)作为目标应用程序

关于同一个问题也有类似的帖子,但这些回复并没有让我找到解决方案

输出显示“from bytebuddy:agent premain”,但不显示“from bytebuddy:transform”。相反,日志显示属于引导类装入器的许多类的异常,例如:

Event::onError(org.mule.weave.v2.el.WeaveExpressionLanguage,org.mule.runtime.module.artifact.api.classloader)。MuleArtifactClassLoader@6d4b1d14,null,false)
java.lang.IllegalStateException:无法解析java.lang.Exception的类型描述
在net.bytebuddy.pool.TypePool$Resolution$非法的.resolve(TypePool.java:159)
net.bytebuddy.pool.TypePool$Default$WithLazyResolution$LazyTypeDescription.delegate(TypePool.java:914)
位于net.bytebuddy.description.type.TypeDescription$AbstractBase$OfSimpleType$WithDelegation.getSuperClass(TypeDescription.java:8031)
位于nongenericType.getSuperClass(TypeDescription.java:3619)的net.bytebuddy.description.type.TypeDescription$Generic$
在net.bytebuddy.description.type.TypeDefinition$SuperClassIterator.next(TypeDefinition.java:314)
在net.bytebuddy.description.type.TypeDefinition$SuperClassIterator.next(TypeDefinition.java:281)
位于net.bytebuddy.matcher.HasSuperTypeMatcher.matches(HasSuperTypeMatcher.java:53)
...
似乎正在查询类型描述的类加载器没有提供所需的类。有没有办法为这些查找指定备用的
ClassFileLocator

导致错误的特定类装入器是:
org.mule.runtime.module.artifact.api.classloader.MuleArtifactClassLoader

有趣的是,当使用Byteman作为代理时,该工具与预期的一样工作,具有以下规则文件:

规则AsyncHttpClientConfig.Builder。
类com.ning.http.client.AsyncHttpClientConfig$Builder
方法
出口处
如果是真的
做
traceln(“来自byteman:AsyncHttpClientConfig$Builder.triggered:”+getClass().getClassLoader());
ENDRULE
任何建议都将不胜感激!
谢谢你的帮助

堆栈跟踪显示您正在使用Byte Buddy应用超级类型检查,而Byteman不使用该检查。如果用名为(…)
匹配器替换名为(…)
hasSuperType(名为(…)
匹配器,它可能会正常工作,因为这似乎是发生错误的地方。Byte Buddy需要解析类层次结构中的所有类,以便能够应用在您的情况下似乎不可能的匹配器

然而,
ClassLoader
无法解析
java.lang.Exception
的类文件似乎很奇怪;您正在使用的类加载器可能是一个自定义实现,它不会委托给引导加载器

您可以通过在代理中定义一个自定义的
LocationStrategy
来规避此问题,该代理始终查询引导加载程序作为一个可选选项:

class BootFallbackLocationStrategy implements AgentBuilder.LocationStrategy {

  @Override
  public ClassFileLocator classFileLocator(ClassLoader classLoader, JavaModule module) {
     return new ClassFileLocator.Compound(
       ClassFileLocator.ForClassLoader.of(classLoader),  
       ClassFileLocator.ForClassLoader.ofBootLoader())
  }
}
正如我在评论中提到的,如果您可以指定未能解析类文件的类装入器的类型,