A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张聪珉 中级黑马   /  2013-8-20 16:22  /  989 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张聪珉 于 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:}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

1 个回复

正序浏览
1.类加载器把A.class加载到内存里生成字节码,这时候A上的注解肯定不会被丢弃的. 因为注解B保留到运行时期.  保留策略有三种:   源文件,编译的.class,和运行时期.    如果被丢弃的话,反射就没法获得注解信息了. 只有源文件级别的  会在编译的时候丢弃.  
2.If语句判断的时候,肯定是判断上面是否有注解,而不是判断上面是否有b.class.就目前我接触到的java知识来看,还没有看到过哪个字节码上再加一个字节码的.如果真是这样,我用Class.forName(A.class)岂不是应该返回一个Class数组了.这一点只是猜测.

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马