※取得全部方法
package inheritate; public interface GrandFather { void gf1(); static String gf2(String p) { return ""; } default String gf3(Integer p) { return ""; } } ------------------------------ package inheritate; public abstract class Father implements GrandFather { public abstract void f1(); public static String f2(String p) { return ""; } public String f3(Integer p) { return ""; } } ------------------------------ package inheritate; public class Son extends Father { @Override public void gf1() { System.out.println(""); } static String s1(String p) { return ""; } @Override public void f1() {} }
※
※測試
try { Class<?> clazz = Class.forName("inheritate.Son"); System.out.println("Methods:"); for (Method m : clazz.getMethods()) { System.out.println(m); } System.out.println(System.getProperty("line.separator") + "DeclaredMethods:"); for (Method m : clazz.getDeclaredMethods()) { System.out.println(m); } } catch (ClassNotFoundException e) { e.printStackTrace(); }
※getDeclaredMethods,只會叫出Class.forName裡面定義的方法,不管修飾子是什麼
※getMethods只會叫出修飾子是public的方法
但要注意屬性的繼承是有作用的,抽象方法並不會印出來
介面不寫修飾子,預設是public abstract,所以一定是public,寫private還會編譯錯誤
※注意介面的static不會印出來(default可以),有可能是java8的bug,因為java8才可以寫static方法在裡面,又或者本來就是這樣的設計
※方法常用方法
package inheritate; public class Son extends Father { private String a; private int b; public String getA() { return a; } public void setA(String a) { this.a = a; } public int getB() throws RuntimeException { return b; } public void setB(int b) { this.b = b; } @Override public void gf1() { System.out.println(""); } static String s1(String p) { return ""; } @Override public void f1() {} }
※
※測試
try { Class<?> clazz = Class.forName("inheritate.Son"); for (Method m : clazz.getDeclaredMethods()) { System.out.println("m:" + m); System.out.println("修飾子(數字):" + m.getModifiers()); System.out.println("修飾子(中文):" + Modifier.toString(m.getModifiers())); System.out.println("包.方法名:" + m.getName()); System.out.println("有幾個參數:" + m.getParameterCount()); // System.out.println("有幾個參數:" + m.getParameterTypes().length); System.out.println("回傳型態:" + m.getReturnType()); System.out.println("宣告的類別:" + m.getDeclaringClass());// Son System.out.println("方法的類別:" + m.getClass());// Method for(Class<?> exc:m.getExceptionTypes()){ System.out.println("例外:" + exc); } for (Class<?> p : m.getParameterTypes()) { System.out.println("參數名稱:" + p.getCanonicalName()); } System.out.println(); } } catch (ClassNotFoundException e) { e.printStackTrace(); }
※
※取得全部介面
public interface GrandFather {} public interface Dad {} public class Son implements Dad, GrandFather {} -------------------- try { Class<?> clazz = Class.forName("inheritate.Son"); System.out.println(clazz.getInterfaces().length); for (Class<?> cz : clazz.getInterfaces()) { System.out.println(cz.toGenericString()); System.out.println(cz.toString()); System.out.println(cz.getPackage()); System.out.println(cz.getCanonicalName()); System.out.println(cz.getName()); System.out.println(cz.getSimpleName()); System.out.println(); cz.getFields(); cz.getMethods(); } } catch (ClassNotFoundException e) { e.printStackTrace(); }
※如果Son有繼承父類是取不到的,只能取得介面,且是Son的直接介面
假設Son只有實作Dad,而Dad繼承GrandFather,只會取得Dad而已
※取得父類
public abstract class Father {} public class Son extends Father {} -------------------- try { Class<?> clazz = Class.forName("inheritate.Son"); Class<?> cz = clazz.getSuperclass(); System.out.println(cz.toGenericString()); System.out.println(cz.toString()); System.out.println(cz.getPackage()); System.out.println(cz.getCanonicalName()); System.out.println(cz.getName()); System.out.println(cz.getSimpleName()); System.out.println(); } catch (ClassNotFoundException e) { e.printStackTrace(); }
※如果Son有實作介面是取不到的,只能取得父類,且是Son的直接父類,沒有就是Object
假設Father還有繼承父類或實作類別都取不到
※getSuperclass並沒有length方法,因為父類只有一個,至少有Object,如繼承了,則Object就取不到了
沒有留言:
張貼留言