ASM 5.0.3 With Java 1.8 incorrect maxStack with Java.lang.VerifyError: Operand stack overflow

删除回忆录丶 提交于 2019-12-02 11:31:16
Ramesh Subramanian

I found the solution to resolve such kind of VerifyError with java 1.7 and 1.8

In the transform() method of MyClassFileTransformer , i replaced the line

ClassWriter classWriter = new ClassWriter(classReader, writerFlag); with new line ClassWriter classWriter = new ByteCodeWriter(classReader, loader, writerFlag);

ByteCodeWriter.java

`

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;

public class ByteCodeWriter extends ClassWriter
{
  static final String OBJECT_REPRESENTATION = "java/lang/Object";
  ClassLoader classLoader;

  public ByteCodeWriter(ClassReader classReader, ClassLoader loader, int writerFlag)
  {
    super(classReader, writerFlag);
    this.classLoader = loader;
  }

  protected String getCommonSuperClass(String className1, String className2)
  {
    Class class1;
    Class class2;
    try
    {
      class1 = Class.forName(className1.replace('/', '.'), false, this.classLoader);
      class2 = Class.forName(className2.replace('/', '.'), false, this.classLoader);
    }
    catch (Exception th) {
      throw new RuntimeException(th.getMessage());
    }

    if (class1.isAssignableFrom(class2)) {
      return className1;
    }
    if (class2.isAssignableFrom(class1)) {
      return className2;
    }

    if ((class1.isInterface()) || (class2.isInterface())) {
      return "java/lang/Object";
    }

    do {
      class1 = class1.getSuperclass();
    }
    while (!(class1.isAssignableFrom(class2)));
    return class1.getName().replace('.', '/');
  }
}`

Basically I extend ClassWriter class and override the method getCommonSuperClass

Error while instrumenting class files (asm.ClassWriter.getCommonSuperClass) helped me to resolve the issue.

But i do not know, what is the necessity to override getCommonSuperClass.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!