Javassist:将CtMethod转换为java.lang.reflect.Method

时间:2014-07-15 18:40:41

标签: java reflection methods annotations javassist

我目前需要更改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对象转换为方法对象,至少在不改变原始方法所在的类的情况下。

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

关于您的问题:转化方法< - > CtMethod是不可能的。另外,你打算用克隆方法做什么?如果你想“复制”一个类所在的方法?在同样的原始方法?不可能,因为你会收到一个“已存在的方法”(或类似的)。

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

答案 1 :(得分:2)

我设法通过使用默认的Java Annotation&方法类加上一些反射。 这就是我如何做到的(可能不会帮助任何人,因为我的问题非常具体,但你永远不知道......)(伪代码):

//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);