【Java反射機制】_反射應用——取得類的結構筆記
本章目標:
可以使用反射取得實現的全部介面
可以使用反射取得一個類所繼承的父類
可以使用反射取得一個類的全部構造方法
可以使用反射取得一個類的全部方法
可以使用反射取得一個類的全部屬性
具體內容
反射機制的深入————取得類的結構
在實際開發中,以上的程式就是反射應該最多的地方,當然,反射機制所提供的功能遠遠不止如此,還可以通過反射得到一個類的完整結構,那麼這樣就使用到java.lang.reflect包中的以下幾個類:
Constructor:表示類中的構造方法
Field:表示類中的屬性
Method:表示類中的方法
這三個類都是AccessibleObject類的子類
操作類:
package org.lxh.demo15;interface China{ //定義China介面 public static final String NATIONAL = "China"; //定義全域常量 public static final String AUTHOR = "牛兒吃草"; //定義全域常量 public void sayChina(); //無參的,沒有傳回值的方法 public String sayHello(String name,int age); //定義有兩個參數的方法,並返回內容}public class Person implements China{ private String name; private int age; public Person(){//無參構造 } public Person(String name){ this.name = name; //設定name屬性 } public Person(String name,int age){ this(name); this.age = age; } public void sayChina(){ System.out.println("作者:"+AUTHOR+",國籍:"+NATIONAL); } public String SayHello(String name,int age){ return name+",你好!我今年:"+age+"歲了!"; } public void SetName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String getName(){ return this.name; } public int getAge(){ return this.age; }}
3.1、取得類所實現的全部介面
要想取得一個類所實現的全部介面,則必須使用Class類中的getInterfaces()方法。此方法定義如下:
public Class[] getInterfaces()
此方法返回一個Class類的對象數組,之後就可以直接利用Class類中的getName()方法輸出即可。
如果要想取得一個類所實現的全部介面,可以使用Class類中的
public Class<?>[] getInterfaces()
因為一個類可以同時實現多個介面,所以在此處將以一個數組的形式返回實現的全部介面。
package org.lxh.demo15.classinfodemo;public class GetInterfaceDemo{ public static void main(String args[]){ Class<?> c1 = null; //聲明Class對象 try{ c1 = Class.forName("org.lxh.demo15.Person"); //執行個體化對象 }catch(ClassNotFoundException e){ e.printStackTrace(); } Class<?> c[] = c1.getInterfaces(); for(int i=0;i<c.length;i++){ System.out.println("實現的介面名稱:"+c[i].getName());//輸出介面名稱 } }}3.2、取得類所繼承的父類
格式:
public Class<? super T> getSuperclass()
此方法返回的是Class執行個體地,和之前得到介面一樣,可以通過getName()方法取得名稱。
取得父類
package org.lxh.demo15.classinfodemo;public class GetSuperClassDemo{ public static void main(String args[]){ Class<?> c1 = null; try{ c1 = Class.forName("org.lxh.demo15.Person"); }catch(ClassNotFoundException e){ e.printStackTrace(); } Class<?> c2 = c1.getSuperclass(); //取得父類 System.out.println("父類名稱:"+c2.getName()); }}
3.3、取得類中的全部構造方法
package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;public class GetConstructorDemo01{ public static void main(String args[]){ Class<?> c1 = null; try{ c1 = Class.forName("org.lxh.demo15.Person"); }catch(ClassNotFoundException e){ e.printStackTrace(); } Constructor<?> con[] = c1.getConstructors(); for(int i=0;i<con.length;i++){ System.out.println("構造方法:"+con[i]); //輸出構造,直接列印 } }}
Constructor類中存在了以下的幾個方法:
取得修飾符:public int getModifiers()
取得方法名稱:public String getName()
取得參數的類型:public Class<?>[] getParameterTypes()
package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;public class GetConstructorDemo02{ public static void main(String args[]){ Class<?> c1 = null; try{ c1 = Class.forName("org.lxh.demo15.Person"); }catch(ClassNotFoundException e){ e.printStackTrace(); } Constructor<?> con[] = c1.getConstructors(); for(int i=0;i<con.length;i++){ Class<?> p[] = con[i].getParameterTypes(); //得到構造方法中的全部參數 System.out.print("構造方法:"); //輸出構造,直接列印 System.out.print(con[i].getModifiers()+" "); //得到修飾符 System.out.print(con[i].getName()); //取得構造方法的名字 System.out.print("("); for(int j=0;j<p.length;j++){ System.out.print(p[j].getName()+"arg"+i); if(j<p.length-1){ System.out.print(","); //輸出"," } } System.out.println("){}"); } }}
此時,在操作之後,發現,所有的修飾符變成了數字.
下面還原修飾符
public static String toString(int mod)
int mo = con[i].getModifiers(); //取出許可權
System.out.print(Modifier.toString(mo)+" "); //還原許可權
下面修改如下:
package org.lxh.demo15.classinfodemo;import java.lang.reflect.Constructor;import java.lang.reflect.Modifier;public class GetConstructorDemo03{ public static void main(String args[]){ Class<?> c1 = null; try{ c1 = Class.forName("org.lxh.demo15.Person"); }catch(ClassNotFoundException e){ e.printStackTrace(); } Constructor<?> con[] = c1.getConstructors(); for(int i=0;i<con.length;i++){ Class<?> p[] = con[i].getParameterTypes(); //得到構造方法中的全部參數 System.out.print("構造方法:"); //輸出構造,直接列印 int mo = con[i].getModifiers(); //取出許可權 System.out.print(Modifier.toString(mo)+" "); //還原許可權 System.out.print(con[i].getName()); //取得構造方法的名字 System.out.print("("); for(int j=0;j<p.length;j++){ System.out.print(p[j].getName()+"arg"+i); if(j<p.length-1){ System.out.print(","); //輸出"," } } System.out.println("){}"); } }}
3.4、取得類中的方法
public Method[] getDeclaredMethods() throws SecurityException //輸出本類的全部方法
public Method[] getMethods() throws SecurityException //輸出本類的全部方法
方法操作:
取得全部的傳回值:public Class<?> getReturnType()
取得全部的參數:public Class<?>[] getParameterTypes()
取得修飾符:public int getModifiers()
取得異常資訊:public Class<?>[] getExceptionTypes()
package org.lxh.demo15.classinfodemo ;import java.lang.reflect.Method ; // 匯入構造方法的包import java.lang.reflect.Modifier ; // 匯入構造方法的包public class GetMethodDemo{ public static void main(String args[]){ Class<?> c1 = null ; // 聲明Class對象 try{ c1 = Class.forName("org.lxh.demo15.Person") ; // 執行個體化對象 }catch(ClassNotFoundException e){ e.printStackTrace() ; } Method m[] = c1.getMethods() ; // 取得全部方法 for(int i=0;i<m.length;i++){ Class<?> r = m[i].getReturnType() ; // 得到傳回值類型 Class<?> p[] = m[i].getParameterTypes() ; // 取得全部參數的類型 int xx = m[i].getModifiers() ; // 得到修飾符 System.out.print(Modifier.toString(xx) + " ") ; // 輸出修飾符 System.out.print(r + " ") ; System.out.print(m[i].getName()) ; System.out.print("(") ; for(int j=0;j<p.length;j++){ System.out.print(p[j].getName() + " " + "arg" + j) ; if(j<p.length-1){ System.out.print(",") ; } } Class<?> ex[] = m[i].getExceptionTypes() ; // 取出異常 if(ex.length>0){ System.out.print(") throws ") ; }else{ System.out.print(")") ; } for(int j=0;j<ex.length;j++){ System.out.print(ex[j].getName()) ; if(j<p.length-1){ System.out.print(",") ; } } System.out.println() ; } }};3.5、取得類中的屬性
得到實現的介面或父類中的公用屬性:public Field[] getFields() throws SecurityException
得到本類中的全部屬性:public Field[] getDeclaredFields() throws SecurityException
package org.lxh.demo15.classinfodemo ;import java.lang.reflect.Field ; // 匯入構造方法的包import java.lang.reflect.Modifier ; // 匯入構造方法的包public class GetFieldDemo{ public static void main(String args[]){ Class<?> c1 = null ; // 聲明Class對象 try{ c1 = Class.forName("org.lxh.demo15.Person") ; // 執行個體化對象 }catch(ClassNotFoundException e){ e.printStackTrace() ; } { // 本類屬性 Field f[] = c1.getDeclaredFields() ; // 取得本類中的屬性 for(int i=0;i<f.length;i++){ Class<?> r = f[i].getType() ; // 得到屬性類型 int mo = f[i].getModifiers() ; // 得到修飾符的數字 String priv = Modifier.toString(mo) ; // 還原修飾符 System.out.print("本類屬性:") ; System.out.print(priv + " ") ; System.out.print(r.getName() + " ") ; // 得到屬性類型 System.out.print(f[i].getName()) ; // 輸出屬性名稱 System.out.println(" ;") ; } } { // 公用屬性 Field f[] = c1.getFields() ; // 取得本類中的公用屬性 for(int i=0;i<f.length;i++){ Class<?> r = f[i].getType() ; // 得到屬性類型 int mo = f[i].getModifiers() ; // 得到修飾符的數字 String priv = Modifier.toString(mo) ; // 還原修飾符 System.out.print("公用屬性:") ; System.out.print(priv + " ") ; System.out.print(r.getName() + " ") ; // 得到屬性類型 System.out.print(f[i].getName()) ; // 輸出屬性名稱 System.out.println(" ;") ; } } }};