`
mwei
  • 浏览: 121851 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

Collection’modifiers seem not correct when reflect

    博客分类:
  • java
阅读更多
做练习的时候就抄了如下方法
public static void printModifiers(final Class<?> dataType){
     final int mod=dataType.getModifiers(); //1537 if dataType is Collection.class,
                                           //1537=1024+513=2^10+2^8+1
     if(Modifier.isPrivate(mod)) //one class may have more modifiers
        U.p("private "); //U.p() is similar to System.out.print()
     if(Modifier.isProtected(mod))
        U.p("protedted ");
     if(Modifier.isPublic(mod))
        U.p("public ");
     if(Modifier.isAbstract(mod))
        U.p("abstract ");
     if(Modifier.isFinal(mod))
        U.p("final ");
     if(Modifier.isNative(mod))
        U.p("native ");
     if(Modifier.isInterface(mod))
        U.p("interface ");
     if(Modifier.isStatic(mod))
        U.p("static ");
     if(Modifier.isStrict(mod))
        U.p("strict ");
     if(Modifier.isSynchronized(mod))
        U.p("synchronized ");
     if(Modifier.isTransient(mod))
        U.p("transient ");
     if(Modifier.isVolatile(mod))
        U.p("volatile ");
     U.pl(dataType.getName());//U.pl() is similar to System.out.println()
}
public static void main(String[] args){
     printModifiers(Collection.class);
}

控制台输出:
      public abstract interface java.util.Collection

看着有点别扭,嗯?怎么多了个abstract?bug?jdk bug?
断点调试、查看源代码
import java.util.Collection; //导入的没错
public interface Collection<E> extends Iterable<E> //接口声明
public interface Iterable<T> //没有继承任何接口
public native int getModifiers(); //Class<T>中的本地方法
public final class Class<T> implements java.io.Serializable,
                              java.lang.reflect.GenericDeclaration, 
                              java.lang.reflect.Type,
                              java.lang.reflect.AnnotatedElement ;
public static boolean isAbstract(int mod) { //Modifier中的静态方法实现
       return (mod & ABSTRACT) != 0;
}
public static final int ABSTRACT  = 0x00000400; //1024=2^10=4^5=4*16^2
//1537&1024=1024

还在怀疑public native int getModifiers()这个本地方法出错了。
上帝这么容易让我找到了jdk5的bug。
反问自己:Collection是abstract的吗?它有abstract方法吗? 恍然大悟,只要有方法都是抽象方法。有点埋怨,java作为一门严格的语言,那么在声明接口的时候也应该强制PG加上abstract,干嘛还来个隐式的?那么反射的时候又干嘛给加上?

小学的时候,考了100分,以为自己长大了能当个伟大的科学家。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics