黑马程序员技术交流社区

标题: 注解在反射中的调用问题 [打印本页]

作者: 张聪珉    时间: 2013-8-20 16:22
标题: 注解在反射中的调用问题
本帖最后由 张聪珉 于 2013-8-23 13:39 编辑
  1. @B(annotationAttr=@MetaAnnotation("flx"),color="red",value="abc",arrayAttr=1)
  2. public class A {


  3.         public static void main(String[] args) throws Exception{
  4.                 // TODO Auto-generated method stub
  5.                 System.runFinalizersOnExit(true);
  6.                 if(A.class.isAnnotationPresent(B.class)){
  7.                         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