Javassist - 从方法中删除静态修饰符

标签 java static instrumentation javassist modifiers

我正在编写一些 Javassist 代码来拦截方法调用并用代理替换它们。为此,我使用 ExprEditor 按以下方式替换调用:

public static void main(String[] args) {

    try {

        ClassPool pool = ClassPool.getDefault();
        CtClass ctClass = pool.get("Test");
        CtMethod meth = ctClass.getDeclaredMethod("main");
        meth.instrument(new ExprEditor() {
            @Override
            public void edit(final MethodCall m) throws CannotCompileException {
                try {
                    if (m.getClassName().contains("Functions")) {

                        /* MAKE NON STATIC
                        CtClass old = pool.get(m.getClassName());
                        m.getMethod().setModifiers(Modifier.PUBLIC);
                        old.toClass();
                        */

                        String s = m.getClassName() + " proxy = (" +
                                m.getClassName() + ") " + Main.class.getName() + ".create(" + m.getClassName() + ".class);" +
                                " $_ = proxy." + m.getMethodName() + "($$);";
                        m.replace(s);

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        Class clazz = ctClass.toClass();
        Method method = clazz.getMethod("main", String[].class);
        method.invoke(null, new Object[]{new String[]{}});

    } catch (InvocationTargetException e) {
        e.getCause().printStackTrace();
    } catch (NoSuchMethodException | IllegalAccessException | NotFoundException | CannotCompileException e) {
        e.printStackTrace();
    }
}

只要该方法不是静态的,它就可以按需要工作。现在我试图通过使用注释代码将静态方法更改为非静态方法。 在我看来,这应该可行,并且 Javassist 文档中其他修饰符也有类似的用法,但是当我取消注释并运行它时,我收到以下错误消息:

javassist.CannotCompileException: by java.lang.ClassFormatError: Arguments can't fit into locals in class file Functions/Color

我还尝试删除 static 修饰符,而不是仅仅将修饰符设置为 public

 m.getMethod().setModifiers(m.getMethod().getModifiers() & ~Modifier.STATIC);

但问题仍然存在。

这真的可能吗?

最佳答案

因此,您尝试从类 Test 中的保留入口点方法名称“main”中删除静态修饰符。我认为编译器不会让你这样做,因为 main 是一个保留的方法名称,只能有一个预定义的签名。而且,静态方法也是有问题的;当从类内部调用时,如果删除 static 修饰符,对它们的所有调用也会导致编译错误,因为它们在原始代码中不是实例方法。

关于Javassist - 从方法中删除静态修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49896321/

相关文章:

Java计算器 - 调车场

具有静态成员的 C++ 寄存器模式有效 "sometimes"

java - 通过附加 API 检测 Java 类

android - 仪表:控制生命周期

java - 在 Dagger 中实现单例构建器

java - 从 java 中使用 Tesseract

java - 如何将字节与字符分开?

c++ - 如何定义指向文件流的静态指针?

silverlight - 如何为 Phone7 Silverlight 应用程序使用 {x :Static . ..} 扩展?

c++ - 访问在 C 中保存 C++ 对象的空指针的内容