※取得全部建構子
package inheritate; public abstract class Father implements GrandFather { Father(){} Father(String s){} } ------------------------------ package inheritate; public class Son extends Father { Son() {} public Son(String s) {} Son(int i, String s) {} }
※GrandFather是介面,因介面是沒有建構子的,所以不貼出來
※測試
try { Class<?> clazz = Class.forName("inheritate.Son"); System.out.println("Constructors:"); for (Constructor<?> c : clazz.getConstructors()) { System.out.println(c); } System.out.println(System.getProperty("line.separator") + "DeclaredConstructors:"); for (Constructor<?> c : clazz.getDeclaredConstructors()) { System.out.println(c); } } catch (ClassNotFoundException e) { e.printStackTrace(); }
※getDeclaredConstructors,會叫出Class.forName裡面定義的建構子,不管修飾子是什麼
※getConstructors只會叫出修飾子是public的建構子
但要注意繼承的父類並不會出現,也就是Father抽象類別(沒抽象也是一樣)沒有作用
※建構子常用方法
package inheritate; public class Son extends Father { private int i; private String s; // setter/getter... Son() {} private Son(String s) {} protected Son(int i, String s) { this.i = i; this.s = s; } public Son(String s, int i) { this.s = s; this.i = i; } } -------------------- package inheritate; public class Father { public Father() {} Father(String s) {} }
※
※測試
try { Class<?> clazz = Class.forName("inheritate.Son"); System.out.println("幾個建構子:" + clazz.getDeclaredConstructors().length); System.out.println(); for (Constructor<?> c : clazz.getDeclaredConstructors()) { System.out.println("c:" + c); System.out.println("修飾子(數字):" + c.getModifiers()); System.out.println("修飾子(中文):" + Modifier.toString(c.getModifiers())); System.out.println("包.類名:" + c.getName()); System.out.println("有幾個參數:" + c.getParameterCount()); // System.out.println("有幾個參數:" + c.getParameterTypes().length); for (Class<?> p : c.getParameterTypes()) { System.out.println("參數名稱:" + p.getCanonicalName()); } System.out.println(); } // 塞值 Constructor<?> c1 = clazz.getDeclaredConstructors()[0]; try { Son s1 = (Son) c1.newInstance("xxx", 1); System.out.println(s1.getI()); System.out.println(s1.getS()); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } // 有可能出現「Class reflection.Test can not access a member of class inheritate.Son with modifiers "protected"」,看測試類有沒有在同個package或者是否是Son的子類而定 Constructor<?> c2 = clazz.getDeclaredConstructors()[1]; try { Son s2 = (Son) c2.newInstance(2, "ooo"); System.out.println(s2.getI()); System.out.println(s2.getS()); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); }
※getName、getCanonicalName很像,以下是差別
※getName、getCanonicalName差別
package inheritate; public class Son { public static class Grandson {} } -------------------- package inheritate; public interface GrandFather { public static String gf2(String p) { return ""; } default String gf3(Integer p) { return ""; } }
※
※測試
// 內部類別 Class<?> sg = Son.Grandson.class; System.out.println(sg.getName());//inheritate.Son$Grandson System.out.println(sg.getCanonicalName());//inheritate.Son.Grandson System.out.println(); // 陣列 Integer[] iArray1 = {}; int[] iArray2 = {}; System.out.println(iArray1.getClass().getName());//[Ljava.lang.Integer; System.out.println(iArray1.getClass().getCanonicalName());//java.lang.Integer[] System.out.println(); System.out.println(iArray2.getClass().getName());//[I System.out.println(iArray2.getClass().getCanonicalName());//int[] System.out.println(); // 介面、類別 System.out.println(new GrandFather(){}.getClass().getName());//Test$1 System.out.println(new GrandFather(){}.getClass().getCanonicalName());//null
※總之getCanonicalName比較好閱讀
※取得全部屬性
package inheritate; public interface GrandFather { String gf1 = ""; String gf2 = ""; } ------------------------------ package inheritate; public abstract class Father implements GrandFather { public String f1 = ""; String gf2 = ""; public static String sf = ""; } ------------------------------ package inheritate; public class Son extends Father { public String son = ""; static String sson = ""; }
※
※測試
try { Class<?> clazz = Class.forName("inheritate.Son"); System.out.println("Fields:"); for (Field f : clazz.getFields()) { System.out.println(f); } System.out.println(System.getProperty("line.separator") + "DeclaredFields:"); for (Field f : clazz.getDeclaredFields()) { System.out.println(f); } } catch (ClassNotFoundException e) { e.printStackTrace(); }
※getDeclaredFields,只會叫出Class.forName裡面定義的屬性,不管修飾子是什麼
※getFields只會叫出修飾子是public的屬性
但要注意屬性的繼承是有作用的,不管是class、interface,只要是public都會印出來
介面的屬性不寫修飾子,預設就是public static final,所以一定是public,寫private、protected會編譯錯誤
※屬性常用方法
package inheritate; public class Son extends Father { public String son = ""; public static String sson = ""; } ------------------------------ package inheritate; public abstract class Father implements GrandFather { public String f1 = ""; String gf2 = ""; public static String sf = ""; } ------------------------------ package inheritate; public interface GrandFather { String gf1 = ""; String gf2 = ""; }
※
※測試
try { Class<?> clazz = Class.forName("inheritate.Son"); System.out.println(System.getProperty("line.separator") + "DeclaredFields:"); for (Field f : clazz.getDeclaredFields()) { int modifiers = f.getModifiers(); System.out.println("修飾子(數字):" + modifiers); System.out.println("修飾子(中文):" + Modifier.toString(modifiers)); Class<?> type = f.getType(); System.out.println("type:" + type); System.out.println("屬性類型:" + type.getCanonicalName()); System.out.println("屬性名稱:" + f.getName()); System.out.println("宣告的類別:" + f.getDeclaringClass());// Son System.out.println("欄位的類別:" + f.getClass());// Field } } catch (ClassNotFoundException e) { e.printStackTrace(); }
※
沒有留言:
張貼留言