标签:java-8 reflection annotations java
我认为标题说明了问题.这是一些代码:
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层重新读取.在这些副本中,您可以更改值,但是如果重新加载,这些值将消失.
有什么我想念的东西还是真的不可能吗?
解决方法:
注释是修饰符,就像私有的或同步的一样.它们是类的不变静态结构的一部分,不希望被修改.您可以侵入Reflection实现中,以使特定方法打印出您想要的内容,但是除了骇人听闻的污垢外,您只是没有更改注释,而只是侵入了特定库的数据结构.
还有其他的反射或字节码操作库,它们不会使用内置的反射API,而是直接读取字节码(例如,通过getResource()或通过Instrumentation API).这些库永远不会注意到您的操作.
进一步注意,由于这些值被认为是嵌入在类文件中的常量,因此反射实现可能始终使用延迟获取以及根据无法控制的条件删除高速缓存的值,因为这些值始终可以重新获取.也没有任何保证,反射实现完全使用数据结构;它也可能生成返回常数值的代码.
换句话说,如果您想将可变数据与方法相关联,请不要使用注释.您可以简单地使用Map< Method,MutableData> ;,或者,如果您只有一个特定的方法,则声明一个好的旧静态字段,该字段已经提供了您所需的所有功能,并且更易于处理.
标签:java-8,reflection,annotations,java 来源: https://codeday.me/bug/20191028/1948764.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。