java 运行时修改类_在运行时修改类定义的注释字符串参数

在OSX上测试过。效果很好。

由于我还需要在运行时更改注释值,所以我重新讨论了这个问题。

下面是@assylias方法的修改版本(非常感谢您的启发)。/**

* Changes the annotation value for the given key of the given annotation to newValue and returns

* the previous value.

*/@SuppressWarnings("unchecked")public static Object changeAnnotationValue(Annotation annotation, String key, Object newValue){

Object handler = Proxy.getInvocationHandler(annotation);

Field f;

try {

f = handler.getClass().getDeclaredField("memberValues");

} catch (NoSuchFieldException | SecurityException e) {

throw new IllegalStateException(e);

}

f.setAccessible(true);

Map memberValues;

try {

memberValues = (Map) f.get(handler);

} catch (IllegalArgumentException | IllegalAccessException e) {

throw new IllegalStateException(e);

}

Object oldValue = memberValues.get(key);

if (oldValue == null || oldValue.getClass() != newValue.getClass()) {

throw new IllegalArgumentException();

}

memberValues.put(key,newValue);

return oldValue;}

用法示例:@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface ClassAnnotation {

String value() default "";}@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface FieldAnnotation {

String value() default "";}@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface MethodAnnotation {

String value() default "";}@ClassAnnotation("class test")public static class TestClass{

@FieldAnnotation("field test")

public Object field;

@MethodAnnotation("method test")

public void method(){

}}public static void main(String[] args) throws Exception {

final ClassAnnotation classAnnotation = TestClass.class.getAnnotation(ClassAnnotation.class);

System.out.println("old ClassAnnotation = " + classAnnotation.value());

changeAnnotationValue(classAnnotation, "value", "another class annotation value");

System.out.println("modified ClassAnnotation = " + classAnnotation.value());

Field field = TestClass.class.getField("field");

final FieldAnnotation fieldAnnotation = field.getAnnotation(FieldAnnotation.class);

System.out.println("old FieldAnnotation = " + fieldAnnotation.value());

changeAnnotationValue(fieldAnnotation, "value", "another field annotation value");

System.out.println("modified FieldAnnotation = " + fieldAnnotation.value());

Method method = TestClass.class.getMethod("method");

final MethodAnnotation methodAnnotation = method.getAnnotation(MethodAnnotation.class);

System.out.println("old MethodAnnotation = " + methodAnnotation.value());

changeAnnotationValue(methodAnnotation, "value", "another method annotation value");

System.out.println("modified MethodAnnotation = " + methodAnnotation.value());}

这种方法的优点是不需要创建新的注释实例。因此,不需要预先知道具体的注释类。另外,副作用应该是最小的,因为原始的注释实例保持不变。

用Java 8进行测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值