菜鳥學Java(十五)——Java反射機制(二)

劉水鏡發表於2013-11-12

上一篇博文《菜鳥學程式設計(九)——Java反射機制(一)》裡面,向大家介紹了什麼是Java的反射機制,以及Java的反射機制有什麼用。上一篇比較偏重理論,理論的東西給人講出來總感覺虛無縹緲,還是結合一些例項比較形象具體。那麼今天就結合更多的例項具體說說。


例項一:獲得完整的類名

package reflection.getclassname;

//獲得完整的類名
public class GetClassName {

    public String getNameByClass() {
        
        String name = "";
        System.out.println("通過類本身獲得物件");
        Class UserClass = this.getClass();
        System.out.println("獲得物件成功!\n");
        
        System.out.println("通過類物件獲得類名");
        name = UserClass.getName();
        System.out.println("獲得類名成功!");
        return name;
    }
    public static void main(String[] args) {
        
        GetClassName gcn = new GetClassName();
        System.out.println("類名為:"+gcn.getNameByClass());
    }

}

執行結果:

通過類本身獲得物件
獲得物件成功!

通過類物件獲得類名
獲得類名成功!
類名為:reflection.getclassname.GetClass Name       



 

 

 

 

 

例項二:獲得類的屬性

package reflection.getfields;

import java.lang.reflect.Field;

//獲得類的屬性
public class GetFields {

    public static void getFieldNames(String className) {
        
        try {
            //獲得類名
            Class c = Class.forName(className);
            //獲得所有屬性
            Field[] fds = c.getFields();
            
            for (int i=0; i<fds.length; i++)
            {
                String fn = fds[i].getName();
                Class tc = fds[i].getType();
                String ft = tc.getName();
                System.out.println("該屬性的名字為:"+fn+",該屬性的型別為:"+ft);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        GetFields.getFieldNames("reflection.getfields.FieldInfo");
    }

}

執行結果:

該屬性的名字為:id,該屬性的型別為:java.lang.String

該屬性的名字為:username,該屬性的型別為:java.lang.String    



 

 

例項三:獲得類實現的介面

package reflection.getinterfaces;

//獲得類實現的介面
public class GetInterfaces {

    public static void getInterfaces(String className) {
        try {
            //取得類
            Class cl = Class.forName(className);
            Class[] ifs = cl.getInterfaces();
            for (int i = 0; i<ifs.length;i++)
            {
                String IName = ifs[i].getName();
                System.out.println("該類實現的介面名字為:"+IName);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        GetInterfaces.getInterfaces("reflection.getinterfaces.Student");
    }

}

執行結果:

該類實現的介面名字為:reflection.getinterfaces.Person    



 

例項四:獲得類及其屬性的修飾符

package reflection.getmodifiers;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

import reflection.UserInfo;

//獲得類及其屬性的修飾符
public class GetModifiers {

    private String username = "liu shui jing";
    float f = Float.parseFloat("1.000");
    public static final int i = 37;
    
    //獲得類的修飾符
    public static String useModifiers(UserInfo ui) {
        
        Class uiClass = ui.getClass();
        int m = uiClass.getModifiers();
        return Modifier.toString(m);
        
    }
    
    //獲得本類屬性的修飾符
    public void checkThisClassModifiers() {
        
        Class tc = this.getClass();        
        Field fl[] = tc.getDeclaredFields();
    
        for(int i=0;i<fl.length;i++)
        {
            System.out.println("第"+(i+1)+"個屬性的修飾符為:"+Modifier.toString(fl[i].getModifiers()));
        }
        
    }
    public static void main(String[] args) {
        
        //獲得類的修飾符
        UserInfo ui =new UserInfo();
        System.out.println("獲得這個類的修飾符:"+GetModifiers.useModifiers(ui)+"\n");
        
        //獲得本類屬性的修飾符
        GetModifiers gm = new GetModifiers();
        gm.checkThisClassModifiers();
        
    }

}

執行結果:

獲得這個類的修飾符:public

 

第1個屬性的修飾符為:private

第2個屬性的修飾符為:

第3個屬性的修飾符為:public static final      



 

 

 

 

 

例項五:獲得類的建構函式

package reflection.getconstructor;

import java.lang.reflect.Constructor;

//獲得類的建構函式
public class GetConstructor {

    //建構函式一
    GetConstructor(int a) {
        
    }
    
    //建構函式二
    GetConstructor(int a, String b) {
        
    }
    
    public static void getConstructorInfo(String className) {
        try {
            //獲得類的物件
            Class cl =Class.forName(className);
            System.out.println("獲得類"+className+"所有的建構函式");
            Constructor ctorlist[] = cl.getDeclaredConstructors();
            System.out.println("遍歷建構函式\n");
            for(int i =0 ; i<ctorlist.length; i++)
            {
                Constructor con = ctorlist[i];
                System.out.println("這個建構函式的名字為:"+con.getName());
                System.out.println("通過建構函式獲得這個類的名字為:"+con.getDeclaringClass());
                
                Class cp[] = con.getParameterTypes();
                for (int j=0; j<cp.length; j++)
                {
                    System.out.println("引數 "+j+" 為 "+cp[j]+"\n");
                }
            }
        }catch (Exception e) {
                System.err.println(e);            
        }
    }
    public static void main(String[] args) {
        GetConstructor.getConstructorInfo("reflection.getconstructor.GetConstructor");
    }

}

執行結果:

獲得類reflection.getconstructor.GetConstructor所有的建構函式

遍歷建構函式

 

這個建構函式的名字為:reflection.getconstructor.GetConstructor

通過建構函式獲得這個類的名字為:class reflection.getconstructor.GetConstructor       

引數 0 為 int

 

這個建構函式的名字為:reflection.getconstructor.GetConstructor

通過建構函式獲得這個類的名字為:class reflection.getconstructor.GetConstructor

引數 0 為 int

 

引數 1 為 class java.lang.String



 

 

 

 

 

 

 

 

 

 

 

例項六:獲得父類

package reflection.getparentclass;

//獲得父類
public class GetParentClass {

    public static String getParentClass(UserInfoMore uim) {
        
        //獲得父類
        Class uimc = uim.getClass().getSuperclass();
        System.out.println("獲得父類的名字為:"+uimc.getName());
        return uimc.getName();
        
    }
    
    public static void searchParentClass() {
        
    }
    
    public static void main(String[] args) {
        
        UserInfoMore uim = new UserInfoMore();
        System.out.println("成功獲得UserInfoMore的父類:"+GetParentClass.getParentClass(uim));
        
    }

}

執行結果:

獲得父類的名字為:reflection.UserInfo

成功獲得UserInfoMore的父類:reflection.UserInfo   



 

 

例項七:獲得類的方法

package reflection.getmethod;

import java.lang.reflect.Method;

//獲得類的方法
public class GetMethod {

    public static void getMethods(String className) {
        try {
            System.out.println("開始遍歷類"+className+".class");
            //獲得類名
            Class cls = Class.forName(className);
            //利用方法獲得所有該類的方法
            System.out.println("利用類的getDeclaredMethods獲得類的所有方法");
            Method ml[] =cls.getDeclaredMethods();
            System.out.println("遍歷獲得的方法陣列\n");
            for (int i = 0 ;i<ml.length;i++)
            {
                System.out.println("開始遍歷第"+(i+1)+"個方法");
                Method m = ml[i];
                System.out.println("開始獲取方法的變數型別");
                Class ptype[] = m.getParameterTypes();
                for (int j=0; j<ptype.length; j++)
                {
                    System.out.println("方法引數"+j+"型別為"+ptype[j]);
                }
                Class gEx[] = m.getExceptionTypes();
                for (int j=0 ; j<gEx.length; j++)
                {
                    System.out.println("異常"+j+"為"+ gEx[j]);
                }
                
                System.out.println("該方法的返回值型別為:"+m.getReturnType()+"\n");
                
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        GetMethod.getMethods("reflection.UserInfo");
    }

}

執行結果:

開始遍歷類reflection.UserInfo.class

利用類的getDeclaredMethods獲得類的所有方法         

遍歷獲得的方法陣列

 

開始遍歷第1個方法

開始獲取方法的變數型別

該方法的返回值型別為:class java.lang.String

 

開始遍歷第2個方法

開始獲取方法的變數型別

該方法的返回值型別為:class java.lang.Integer

 

開始遍歷第3個方法

開始獲取方法的變數型別

方法引數0型別為class java.lang.String

該方法的返回值型別為:void

 

開始遍歷第4個方法

開始獲取方法的變數型別

該方法的返回值型別為:class java.lang.String

 

開始遍歷第5個方法

開始獲取方法的變數型別

方法引數0型別為class java.lang.Integer

該方法的返回值型別為:void

 

開始遍歷第6個方法

開始獲取方法的變數型別

該方法的返回值型別為:class java.lang.String

 

開始遍歷第7個方法

開始獲取方法的變數型別

方法引數0型別為class java.lang.String

該方法的返回值型別為:void

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

這次例項不少吧,而且這些小例子都比較簡單,相信大家都可以輕鬆秒懂。上面一些例子的程式碼並不是完整的,有些只有一些關鍵程式碼,如果想要完整的程式碼請戳下面的連結。最後祝大家學習愉快!

 

原始碼下載

 

相關文章