在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进行测试。

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

  1. java运行库一键修复_在运行时修补Java

    java运行库一键修复 本文将重点介绍如何解决与第三方库相关的问题 不能被规避 难以排除/绕过/更换 只需不提供错误修正 在这种情况下,解决问题仍然是一项艰巨的任务. 作为这种情况的诱因,请考虑对&q ...

  2. java 使用不同目录下的类_如何运行在不同目录下的java类文件? - Break易站

    Java 基础语法 在本文中,我们将学习如何使用其他项目的实用程序,类和成员.在继续之前,让我们了解一些关键字. 类路径 类路径是jvm开始执行程序的位置.与传统的动态加载行为类似,当执行Java程序 ...

  3. JAVA给banking作界面_银行运行模拟编程 求助!!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 public CheckingAccount(double bal, double protect) public CheckingAccount(dou ...

  4. java 元类_[译]什么是元类metaclass?

    类即对象 在理解元类之前,需要先掌握Python中的类,Python中类的概念与SmallTalk中类的概念相似. 在大多数语言中,类是用来描述如何创建对象的代码段,这在Python中也是成立的: & ...

  5. java comparator接口类_常见的接口与类 -- Comparator

    接口Comparator 1.1 前面我们讲过Java提供了一个用于比较的接口Comparable,提供了一个比较的方法,所有实现该接口的类,都动态的实现了该比较方法.实际上Java中除了比较一个接口 ...

  6. input 时分秒输入_输入年月日时分秒

    编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒.如输入 2004 年 12 月 31 日 23 时 59 分 59 秒,则输出 2005 年 1 月 1 日 0 时 0 分 0 秒. ...

  7. 游戏中java未安装不了_游戏运行库和常见游戏安装问题的解决方法

    游戏运行库是玩游戏必不可少的东西,相信玩家们都遇到因为没装某某运行库而导致游戏无法安装或者玩不了的问题,今天小编就为大家列出了一些常见的运行库以及游戏安装和运行时的一些问题的解决方法. 首先小编要为大 ...

  8. java jar包存放位置_获得运行jar包存放路径的方法

    在 java 中, System.getProperty("user.dir") 得到的是当前工作路径(对应命令行命令就是 linux 下的 pwd . windows 下的 cd ...

  9. 安装oculus运行时出现问题_通风管道安装时应该注意的问题

    点上方"蓝色"订阅! 1.风管安装前未清除内部杂物 风管安装前应清除内.外杂物,并做好清洁和成品,施工后及时封堵管口,如不清除杂物,将会造成系统阻力增大,严重时堵塞过滤网和管道. ...

最新文章

  1. [转]Emacs 系列教程
  2. SQL Server数据库大型应用解决方案总结(转载)
  3. python字符串input输入_5.print()函数、转义字符、python注释、常量、字符串、格式化输出、input()输入...
  4. 政策表达式截取json_json格式数据如何提取指定中文字符串。
  5. mysql统计功能和数据库information_schema/performance_schema
  6. 美丽的表格样式(使用CSS样式表控制表格样式)
  7. 内存模型 linux,内存模型 - STM32F4 编程手册学习_Linux编程_Linux公社-Linux系统门户网站...
  8. win2003实现单用户远程登录
  9. 单表查询 多表查询 子查询
  10. 银川JW万豪酒店与银川万怡酒店双品牌酒店启幕
  11. azure java sdk_用于 Azure 媒体服务的 Java SDK 使用入门 | Microsoft Docs
  12. matlab仿真高尔顿正态分布源码,《正态分布》教学设计
  13. java 网络五子棋游戏_基于JAVA的网络五子棋游戏
  14. 使用python解析pdf文件
  15. visio 怎么画直线
  16. 考研英语 - word-list-49
  17. 高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
  18. 大数据时代下的贝叶斯公式
  19. 工作流(Workflow) -- 工作流简介
  20. 使用 JADE 平台进行智能体开发

热门文章

  1. 华为诉争“鸿蒙HongMeng”商标再被驳回;比尔盖茨夫妇正式离婚;iOS 15“查找”新功能,关机也能用|极客头条...
  2. UNIX会被取代吗?来听听UNIX诞生的见证者怎么说~
  3. 支持 RISC-V 芯片的 Android 系统来了!
  4. 程序员的传奇“破圈”之路
  5. OpenSLR 中国镜像背后的数据存储服务商,原来是这样一家公司!
  6. 英特尔推出业界领先的AI与数据分析平台,全新处理器、内存、存储、FPGA解决方案集体亮相
  7. 苹果的廉价机,你也认为“真香”吗?
  8. 深入理解 Java 线程池!
  9. 作为互联网面临的最大危险之一,当前的 DDoS 趋势如何?
  10. 你有真正理解 Java 的类加载机制吗?| 原力计划