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分,以爲自己長大了能當個偉大的科學家。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章