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

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

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

我设法通过使用默认的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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有什么办法可以将org.testng.ITestResult或ITestNGMethod转换为java.lang.reflect.Method。

来自分类Dev

有什么办法可以将org.testng.ITestResult或ITestNGMethod转换为java.lang.reflect.Method。

来自分类Dev

什么是`4161`在java.lang.reflect.Method中修改的平均

来自分类Dev

投java.lang.reflect.Method中的功能接口

来自分类Dev

奇怪的错误java.lang.reflect.Method.invokeNative(Native Method)Android Studio请回答

来自分类Dev

原因:java.lang.ClassCastException:无法将java.lang.Class强制转换为java.lang.reflect.ParameterizedType

来自分类Dev

原因:java.lang.ClassCastException:无法将java.lang.Class强制转换为java.lang.reflect.ParameterizedType

来自分类Dev

Android / Java单元测试-如何在java.lang.reflect.Method中使用参数?

来自分类Dev

Android / Java单元测试-如何在java.lang.reflect.Method中使用参数?

来自分类常见问题

线程“主”中的异常java.lang.UnsatisfiedLinkError:'void org.lwjgl.opengl.WindowsDisplay.setWindowProc(java.lang.reflect.Method)'

来自分类Dev

将java.lang.reflect.Type转换为Class <T> clazz

来自分类Dev

如何将java.lang.reflect.Type转换为枚举?

来自分类Dev

如何将java.lang.reflect.Type转换为枚举?

来自分类Dev

Android中的java.lang.reflect.invocationtargetException

来自分类Dev

java.lang.reflect.Array的性能

来自分类Dev

Roboelectric java.lang.RuntimeException:java.lang.reflect.InvocationTargetException

来自分类常见问题

ByteBuddy中是否有任何方法可以将TypeDescription.Generic转换为适当的java.lang.reflect.Type?

来自分类Dev

ByteBuddy中是否有任何方法可以将TypeDescription.Generic转换为适当的java.lang.reflect.Type?

来自分类Dev

由以下原因引起:java.lang.ClassCastException:使用通用类型时,无法将libcore.reflect.ParameterizedTypeImpl强制转换为java.lang.Class。

来自分类Dev

java.lang.ClassCastException:sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl无法转换为java.lang.Class

来自分类Dev

java.lang.ClassCastException:sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl无法转换为java.lang.Class

来自分类Dev

BigSheets-java.io.IOException:java.lang.reflect.UndeclaredThrowableException

来自分类Dev

为什么显示“ java.lang.reflect.InvocationTargetException”

来自分类Dev

使用java.lang.reflect.Type检查实例

来自分类Dev

了解java.lang.reflect.InvocationHandler的invoke方法的“代理”参数

来自分类Dev

Scala TypeTag到java.lang.reflect.Type

来自分类Dev

显示错误原因:java.lang.reflect.InvocationTargetException

来自分类Dev

了解java.lang.reflect.InvocationHandler的invoke方法的“代理”参数

来自分类Dev

如何从Scala类型获取java.lang.reflect.Type?

Related 相关文章

  1. 1

    有什么办法可以将org.testng.ITestResult或ITestNGMethod转换为java.lang.reflect.Method。

  2. 2

    有什么办法可以将org.testng.ITestResult或ITestNGMethod转换为java.lang.reflect.Method。

  3. 3

    什么是`4161`在java.lang.reflect.Method中修改的平均

  4. 4

    投java.lang.reflect.Method中的功能接口

  5. 5

    奇怪的错误java.lang.reflect.Method.invokeNative(Native Method)Android Studio请回答

  6. 6

    原因:java.lang.ClassCastException:无法将java.lang.Class强制转换为java.lang.reflect.ParameterizedType

  7. 7

    原因:java.lang.ClassCastException:无法将java.lang.Class强制转换为java.lang.reflect.ParameterizedType

  8. 8

    Android / Java单元测试-如何在java.lang.reflect.Method中使用参数?

  9. 9

    Android / Java单元测试-如何在java.lang.reflect.Method中使用参数?

  10. 10

    线程“主”中的异常java.lang.UnsatisfiedLinkError:'void org.lwjgl.opengl.WindowsDisplay.setWindowProc(java.lang.reflect.Method)'

  11. 11

    将java.lang.reflect.Type转换为Class <T> clazz

  12. 12

    如何将java.lang.reflect.Type转换为枚举?

  13. 13

    如何将java.lang.reflect.Type转换为枚举?

  14. 14

    Android中的java.lang.reflect.invocationtargetException

  15. 15

    java.lang.reflect.Array的性能

  16. 16

    Roboelectric java.lang.RuntimeException:java.lang.reflect.InvocationTargetException

  17. 17

    ByteBuddy中是否有任何方法可以将TypeDescription.Generic转换为适当的java.lang.reflect.Type?

  18. 18

    ByteBuddy中是否有任何方法可以将TypeDescription.Generic转换为适当的java.lang.reflect.Type?

  19. 19

    由以下原因引起:java.lang.ClassCastException:使用通用类型时,无法将libcore.reflect.ParameterizedTypeImpl强制转换为java.lang.Class。

  20. 20

    java.lang.ClassCastException:sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl无法转换为java.lang.Class

  21. 21

    java.lang.ClassCastException:sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl无法转换为java.lang.Class

  22. 22

    BigSheets-java.io.IOException:java.lang.reflect.UndeclaredThrowableException

  23. 23

    为什么显示“ java.lang.reflect.InvocationTargetException”

  24. 24

    使用java.lang.reflect.Type检查实例

  25. 25

    了解java.lang.reflect.InvocationHandler的invoke方法的“代理”参数

  26. 26

    Scala TypeTag到java.lang.reflect.Type

  27. 27

    显示错误原因:java.lang.reflect.InvocationTargetException

  28. 28

    了解java.lang.reflect.InvocationHandler的invoke方法的“代理”参数

  29. 29

    如何从Scala类型获取java.lang.reflect.Type?

热门标签

归档