黑马程序员技术交流社区
标题:
注解在反射中的调用问题
[打印本页]
作者:
张聪珉
时间:
2013-8-20 16:22
标题:
注解在反射中的调用问题
本帖最后由 张聪珉 于 2013-8-23 13:39 编辑
@B(annotationAttr=@MetaAnnotation("flx"),color="red",value="abc",arrayAttr=1)
public class A {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
System.runFinalizersOnExit(true);
if(A.class.isAnnotationPresent(B.class)){
B annotation = (B)A.class.getAnnotationB.class);
复制代码
假设B已经注解了@Retention(RetentionPolicy.RUNTIME)保留到运行时期,我现在不太明白的是,当编译器把源文件A编译生成A.class的时候也生成了B.class对吗?接下来,类加载器把A.class加载到内存里生成字节码,这个时候会把A.class文件的注释去掉是不是?接着If语句判断的是A的字节码里是否有B的字节码还是判断是否有B的注解,另外,If语句执行的时候,是不是把B也加载到内存中了?高新好难啃啊,面试题是不是更难{:soso_e105:}
作者:
黑马伍哲沂
时间:
2013-8-20 21:01
1.类加载器把A.class加载到内存里生成字节码,这时候A上的注解肯定不会被丢弃的. 因为注解B保留到运行时期. 保留策略有三种: 源文件,编译的.class,和运行时期. 如果被丢弃的话,反射就没法获得注解信息了. 只有源文件级别的 会在编译的时候丢弃.
2.If语句判断的时候,肯定是判断上面是否有注解,而不是判断上面是否有b.class.就目前我接触到的java知识来看,还没有看到过哪个字节码上再加一个字节码的.如果真是这样,我用Class.forName(A.class)岂不是应该返回一个Class数组了.这一点只是猜测.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2