【问题标题】:Javassist: Convert CtMethod to java.lang.reflect.MethodJavassist:将 CtMethod 转换为 java.lang.reflect.Method
【发布时间】:2023-03-22 19:04:01
【问题描述】:

我目前需要更改 java.lang.reflect.Method 对象的注释,它应该是原始方法的克隆,因此原始方法不会被修改。为此,我下载了 Library Javassist。所以,基本上,这样做的最佳代码是:

java.lang.reflect.Method myMethod = /*obtain it*/;
java.lang.reflect.Method myMethodClone = myMethod.clone();
myMethodClone.removeAllAnnotations();
myMethodClone.addAnnotation("@MyAnnotation(something=\"something\", etc");

但不幸的是,类似这个伪代码的代码是不可能的。我尝试使用javassist解决我的问题,但后来我遇到了另一个问题:我无法将Javassists CtMethod Object转换为Method Object,至少在不更改原始方法所在的类的情况下不能。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: java reflection methods annotations javassist


    【解决方案1】:

    javassist 使用他自己的类层次结构,而不是 Java 层次结构。如果您想使用 javassist,请开始阅读官方文档及其工作原理。

    关于你的问题:转换方法 CtMethod 是不可能的。上瘾了,你打算用克隆方法做什么?如果您想“复制”一个方法,它将存在于哪个类中?和原来的方法一样吗?不可能,因为你会收到一个“已经存在的方法”(或类似的)。

    javassist 可以解决您的问题,但如果不可能,则可以提供完整的答案,因为问题非常模糊。我的建议是从官方文档开始或使用this tutorial

    【讨论】:

    • 感谢您的回答!虽然我已经解决了我的问题,但忘记在此处发布解决方案......我真的很抱歉,现在就去做。
    • 现在就做。真的很抱歉我来晚了。
    【解决方案2】:

    通过使用默认的 java Annotation & Method 类以及一些反射,我设法让我的代码正常工作。 我是这样做的(可能对任何人都没有帮助,因为我的问题非常具体,但你永远不知道......)(伪代码):

    //Create Annotation
    MyAnnotationOld oldAnnotation;
    MyAnnotation modifiedAnnotation = new MyAnnotation{
    public Class<? extends java.lang.annotation.Annotation> annotationType() {return oldAnnotation.annotationType();}
    public String propertyWhichShallRemainTheSame() {return oldAnnotation.propertyWhichShallRemainTheSame();}
    public String propertyWhichShallBeModified() {return "Modified Thingy";}
    }
    
    //Copy Method
    Method toCopy;
    Method copyMethod = Method.class.getDeclaredMethod("copy", (Class<?>[])null);
    copyMethod.setAccessible(true);
    Method copiedMethod = (Method) copyMethod.invoke(toCopy, (Object[]) null);
    
    //Add annotation to copied method
    Field field = Method.class.getDeclaredField("declaredAnnotations");
    field.setAccessible(true);
    //Intantiate field !!IMPORTANT!! If you don't do this, the field will be null and thus return an error.
    copiedMethod.getAnnotations();
    Map<Class<? extends Annotation>, Annotation> annotations = (Map<Class<? extends Annotation>, Annotation>) field.get(copiedMethod);
    annotations.put(MyAnnotation.class, modifiedAnnotation);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多