Collection’modifiers seem not correct when reflect

做练习的时候就抄了如下方法

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 [b]abstract[/b] 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分,以为自己长大了能当个伟大的科学家。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章