我目前需要更改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来解决我的问题,但随后我遇到了另一个问题:我不能将javassist的CtMethod对象转换为方法对象,至少不能在不改变原始方法所在的类的情况下转换。
谁知道怎么解决这个问题?
javassist使用自己的类层次结构,而不是Java的。如果您想使用javassist,请开始阅读官方文档并了解其工作原理。
关于你的问题:转换方法<-> CtMethod是不可能的。在成瘾方面,你打算用克隆方法做什么?如果您想"复制"一个方法,它将驻留在哪个类中?和原来的方法一样吗?不可能,因为你会收到一个"方法已经存在"(或类似的)。
javassist可以解决您的问题,但如果不可能提供完整的答案,因为问题相当模糊。我的建议是从官方文档开始,或者使用本教程
我设法让我的代码工作通过使用默认的java注释&方法类加上一些反射。以下是我是如何做到的(可能不会帮助任何人,因为我的问题是非常具体的,但你永远不会知道…)(伪代码):
//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);