1. java如何判斷一個類是否實現了某個介面
Class中有個方法 public native boolean isAssignableFrom(Class<?> cls)用來判斷子類是否繼承於父類的或者父介面的。
你會這樣子寫:
Class clazz = ....;
clazz.isAssignableFrom(子類名稱);返回true說明是掛號里的類的父類或父介面。
clazz.isAssignableFrom(子類名稱)里的子類名稱跟版本有關,好像是1.5以上的JDK這里的子類名稱都是使用的泛型編程。即傳的傳數是
class<T> 類型的,你用的時候自己斟酌下版本問題。
而常用的instanceof(class ..)是指該實例是否屬於掛號中的類的父類的一個實例。
如上面的例子:
class A{
}
public class B extends A{
public static void main(String[] args){
Class clazz = B.class;
Class class1 = A.class;
System.out.println(class1.isAssignableFrom(clazz));
if(class1.isAssignableFrom(clazz)){
System.out.println("A是B的父類");
}else{
System.out.println("A不是B的父類");
2. java判斷是不是基本類型,基本類型與對應的包裝類
isPrimitive() 可以判斷是否為基本類型
完整為:aClass.getMethod(getMethodName).getReturnType().isPrimitive()
包裝類可以為:Number.class.isAssignableFrom(methodReturnType) 重點是isAssignableFrom()方法
3. 怎麼知道Java class文件JDK編譯的版本號
首先用一些二進制查看器打開class文件,比如od或者hexmp工具。
od -x hello.class
或者
hexmp hello.class
我們會看到類似於下面的輸出:
feca beba 0000 3300
這里我們看到前四個位元組是Java class的特殊符號,叫做magic欄位,用來告訴JVM這是個class文件,之後的兩個位元組是minor版本號,再之後的兩個位元組是major版本號,我們看到時33,對應下表我們知道33時JDK1.7編譯的版本號。
十六進制
JDK1.5 31
JDK1.6 32
JDK1.7 33
JDK8 34
因為Java是向後兼容的,所以高版本的兼容低版本的,所以有時候你遇到java報: unsupported major.minor version 51,那就是你用低版本的虛擬機去運行高版本JDK編譯的class文件了,所以低版本的虛擬機就抱怨了。這里的51是十進制,也就是十六進制的33,及對應JDK1.7,如果出現這種錯誤,你肯定是使用低於1.7版本的虛擬機去運行這個了。