【问题标题】:ASM Objectweb visitors without transformation无需转换的 ASM Objectweb 访问者
【发布时间】:2014-11-12 10:34:48
【问题描述】:

我想使用 ASM 来验证某些方法的调用频率以及它们的参数和结果是什么。但是,在运行时,它以 java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "com/foo/bar/DefaultType" 结尾。

出于这个原因,我想确保它不是 ASM (Objectweb) 问题,因此它尝试使用以下代码仅传递字节而不进行任何修改:

@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
  ProtectionDomain protectionDomain, byte[] classfileBuffer)
  throws IllegalClassFormatException {

byte[] result;

if(className.startsWith("com/foo/bar"))
{
    ClassReader reader = new ClassReader(classfileBuffer);

    try 
    {
      ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

      reader.accept(writer, 0);

      result = writer.toByteArray();
    }
    catch(Exception e)
    {
      result = null;
    }
  }
  else
  {
    // do nothing
    result = null;
  }
  return result;
}

但即使经过此修改,我也会收到相同的错误。有什么提示我应该改变什么才能让这段代码正常工作吗?

【问题讨论】:

  • 不,很遗憾没有。所以我仍然缺少统计数据。
  • :(如果我能找到解决方案,我会告诉你。

标签: javaagents java-bytecode-asm


【解决方案1】:

一个老问题的迟到的答案。

这些错误发生的一种方式是由于ClassWriterCOMPUTE_FRAMES 选项是如何实现的。特别是,框架计算有时需要为两个给定的类找出一个共同的超类;为此,它将使用Class.forName 加载它感兴趣的类。如果您的代码库使用非平凡的类加载设置,则可能会以这种方式将类加载到未执行的类加载器中(我不记得确切的条件,但我遇到过这种情况)。解决方案是覆盖ClassWritergetCommonSuperclass 方法,以更安全的方式执行相同的计算。

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    相关资源
    最近更新 更多