当前位置: 首页 > 知识库问答 >
问题:

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

孙朗
2023-03-14
@Something(someProperty = "some value")
public class Foobar {
    //...
}

它已经编译好了(我无法控制源代码),并且是jvm启动时类路径的一部分。我希望能够在运行时将“some value”更改为其他的东西,这样以后的任何反射都将具有我的新值,而不是默认的“some value”。

这可能吗?如果是,怎么做?

共有1个答案

朱丰
2023-03-14

这段代码或多或少地完成了您所要求的--它是一个简单的概念证明:

  • 正确的实现还需要处理declaredannotations
  • 如果class.java中注释的实现发生了变化,那么代码就会中断(即在将来的任何时候都可以中断)
  • 我不知道是否有副作用...

输出:

public static void main(String[] args) throws Exception {
    final Something oldAnnotation = (Something) Foobar.class.getAnnotations()[0];
    System.out.println("oldAnnotation = " + oldAnnotation.someProperty());
    Annotation newAnnotation = new Something() {

        @Override
        public String someProperty() {
            return "another value";
        }

        @Override
        public Class<? extends Annotation> annotationType() {
            return oldAnnotation.annotationType();
        }
    };
    Field field = Class.class.getDeclaredField("annotations");
    field.setAccessible(true);
    Map<Class<? extends Annotation>, Annotation> annotations = (Map<Class<? extends Annotation>, Annotation>) field.get(Foobar.class);
    annotations.put(Something.class, newAnnotation);

    Something modifiedAnnotation = (Something) Foobar.class.getAnnotations()[0];
    System.out.println("modifiedAnnotation = " + modifiedAnnotation.someProperty());
}

@Something(someProperty = "some value")
public static class Foobar {
}

@Retention(RetentionPolicy.RUNTIME)
@interface Something {

    String someProperty();
}
 类似资料:
  • 问题内容: 而且我正在尝试更改方法注释,但是java.lang.reflect.Method不包含任何地图字段(例如“ annotations”)或方法(例如“ getDeclaredAnnotationMap”) 只有但是我可以用这个字节数组做什么? 那么,如何修改方法的注释呢? 编辑: 我创建了:http : //pastebin.com/T2rewcwU 但是,仅编辑此方法实例,如果取消注释

  • 问题内容: 假设我有一个豆子: 然后使用这种测试代码将其转换为JSON或XML: 输出将是这样的: 现在,假设我想用一些动态名称替换“ data”属性: 如果我调用函数 convert(“ toto”), 我将获得以下输出: 如果我调用函数 convert(“ groovy”), 我会得到以下输出: 当然,我可以在JSON创建后执行String替换,但是如果您对程序化方法有一个满意的答案,我会接受

  • 问题内容: 我得到这个错误 问题答案: 具有无效的返回类型。更改方法的返回类型以返回值

  • 介绍 我用这个项目挑战自己。 我需要修改.txt上特定行的数据,而无需执行以下操作: 将所有内容加载到内存中(地图,列表,数组... 必须复制文件(例如 - 一个简单的.txt文件将拥有一切! 文本文件 遵循这种格式,即以“;”作为分隔符的字符串。 我的代码尝试从0到9的数字 (0 到 9 表示第一个数字 - 理解问题 字符串 - 最后两个“0”将是另一个日期格式,即“yy/MM/dd HH:MM

  • 问题内容: 对于拥有ejb经验的人来说,这可能是一个愚蠢的问题。 我想动态地读取和更改我的其中一个通过注释使用Java EE调度程序的EJB Bean的分钟参数。有人知道如何在运行时执行此操作,而不是像在下面的类中对其进行硬编码?如果我要以编程方式进行操作,是否仍可以使用注释? 问题答案: 用于容器在部署期间创建的自动计时器。 另一方面,可以使用它允许您在运行时定义何时应调用该方法。 这可能是您感

  • 是否有任何方法可以使用Retrofit并将参数运算符符号替换为我自己的运算符(例如)。 这将创建 但我需要 谢啦