gpt4 book ai didi

java - 在 Java 8 中更改字段注释的注释值

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:41 26 4
gpt4 key购买 nike

我认为标题描述了问题。这是一些代码:

import static org.junit.Assert.assertEquals;
import java.lang.annotation.*;

public class Main {
public static void main(String[] args) throws Exception {
assertEquals("foo", Main.class.getDeclaredMethod("myMethod").getAnnotation(Anno.class).param());

// the magic here -> set to bar

assertEquals("bar", Main.class.getDeclaredMethod("myMethod").getAnnotation(Anno.class).param());
}

@Anno(param = "foo")
public void myMethod() {}

@Retention(RetentionPolicy.RUNTIME)
@interface Anno {
String param();
}
}

到目前为止,我猜这是不可能的。似乎总是当您尝试通过反射获取方法时,您只会获得副本,并且所有值(如注释)都是从更深的 java 层重新读取的。在这些副本中,您可以更改值,但如果您重新加载,这些值将消失。

是不是我漏掉了什么,或者真的不可能吗?

最佳答案

注解是修饰符,就像privatesynchronized .它们是类的不变静态结构的一部分,不打算修改。您可以侵入反射实现,使特定方法打印您想要的内容,但除了黑客的肮脏之外,您根本没有更改注释,您只是侵入了特定库的数据结构。

还有其他反射或字节码操作库,它们不使用内置反射 API,而是直接读取字节码(例如通过 getResource() 或通过 Instrumentation API)。这些库永远不会注意到您的操作。

请进一步注意,由于这些值应该是嵌入在类文件中的常量,因此反射实现总是可以使用延迟获取加上根据无法控制的条件删除缓存的值,因为这些值总是可以被重新获取。也不能保证反射实现完全使用数据结构;它还可以生成返回常量值的代码。

换句话说,如果你想将可变数据与方法相关联,请不要使用注释。你可以简单地使用 Map<Method,MutableData> , 或者,如果你只有那个特定的方法,声明一个很好的旧 static字段已经提供了您需要的所有功能并且更容易处理。

关于java - 在 Java 8 中更改字段注释的注释值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32089290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com