java獲取類的信息


關鍵技術剖析

1.java.lang.reflect包實現了java的反射機制,在使用反射機制時,需要導入該包。

2.Class類的forName方法能夠根據類名加載類,獲得類的Class對象。

Class類的getSuperclass方法獲得父類的Class對象;getDeclaredFields方法獲取類聲明的屬性,返回的是一組java.lang.Field對象;getDeclaredConstructors方法獲得類的構造方法,返回的是一組java.lang.reflect.Constructor對象;getMethods方法獲得類的方法,返回的是一組java.lang.reflect.Method的對象。

3.java.olang.reflect.Field描述類聲明的屬性。getModifiers方法獲得屬性的訪問修飾符;getType方法獲得屬性的類型;getName方法獲得屬性名。

4.java.lang.reflect.Constructor描述類的構造方法。getModifiers方法獲得構造方法的訪問修飾符;getName方法獲得方法名,getParameterTypes獲得構造方法的參數類型;getExCeptionTypes方法獲得構造方法聲明的異常。

5.java.lang.reflect.Method描述類聲明的方法。getModifiers方法獲得方法的訪問修飾符;getReturnType方法返回方法的返回類型;getName方法獲得方法名;getParameterTypes方法案獲得方法的參數類型;getExceptionTypes方法獲得聲明的異常。

package com.test;

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

public class Main{
    
    /*獲取類的聲明*/
    private String getClassStatement(Class c){
        StringBuffer buf = new StringBuffer();
        if(c.getName().equals("java.lang.Object")){
            buf.append("public class Object {");
            return buf.toString();
        } else {
            //得到該類的父類名
            String superName = c.getSuperclass().getName();
            buf.append("public class ").append(c.getName()).append(" extends ").append(superName).append(" {");
            return buf.toString();
        }
    }
    
    /*獲取類的屬性*/
    private String getFields(Class c){
        StringBuffer buf = new StringBuffer();
        Field[] fields = c.getDeclaredFields();
        for(Field field : fields){
            //獲取屬性的訪問修飾符
            //Modifier的一些信息 http://www.it165.net/pro/html/201309/7203.html
            buf.append("    ").append(Modifier.toString(field.getModifiers())).append(" ");
            Class<?> type = field.getType();
            buf.append(type.getName()).append(" ");
            buf.append(field.getName()).append(";\n");
        }
        return buf.toString();
    }
    
    /*獲取類的所有構造方法*/
    private String getConstructors(Class c){
        StringBuffer buf = new StringBuffer();
        //獲取類的構造方法
        Constructor<?>[] cons = c.getDeclaredConstructors();
        for(Constructor con : cons){
            //獲取構造方法的訪問修飾符
            buf.append("    ").append(Modifier.toString(con.getModifiers())).append(" ");
            //獲取構造方法的名稱
            buf.append(con.getName()).append("(");
            //獲取構造方法的參數
            Class<?>[] paramType =  con.getParameterTypes();
            for(int i=0; i<paramType.length; ++i){
                if(i != 0){
                    buf.append(paramType[i].getName());
                } else {
                    buf.append(", ").append(paramType[i].getName());
                }
            }
            buf.append(")");
            
            //獲取方法聲明的異常
            Class<?>[] excepTypes = con.getExceptionTypes();
            for(int i=0; i<excepTypes.length; ++i){
                if(i==0){
                    buf.append(" throws ").append(excepTypes[i].getName());
                } else {
                    buf.append(", ").append(excepTypes[i].getName());
                }
            }
            buf.append(";\n");
        }
        return buf.toString();
    }
    
    private String getMethods(Class c){
        StringBuffer buf = new StringBuffer();
        Method[] methods = c.getDeclaredMethods();
        for(Method method : methods){
            //獲取方法的訪問修飾符
            buf.append("    ").append(Modifier.toString(method.getModifiers())).append(" ");
            //獲取方法的返回類型
            Class<?> returnType = method.getReturnType();
            buf.append(returnType.getName()).append(" ");
            buf.append(method.getName()).append(" (");//獲取方法的名稱
            
            //獲取方法的參數類型
            Class<?>[] paramTypes = method.getParameterTypes();
            for(int i=0; i<paramTypes.length; ++i){
                if(i==0){
                    buf.append(paramTypes[i].getName());
                } else {
                    buf.append(", ").append(paramTypes[i].getName());
                }
            }
            buf.append(")");
            
            //獲取方法聲明的異常
            Class<?>[] excepTypes = method.getExceptionTypes();
            for(int i=0; i<excepTypes.length; ++i){
                if(i==0){
                    buf.append(" throws ").append(excepTypes[i].getName());
                } else {
                    buf.append(", ").append(excepTypes[i].getName());
                }
            }
            buf.append(";\n");
        }
        return buf.toString();
    }
    
    public void getClassMessage(){
        StringBuffer buf = new StringBuffer();
        try {
            Class<?> c = Class.forName("com.test.Main");
            buf.append("/*類的聲明*/\n");
            buf.append(getClassStatement(c));
            buf.append("\n");
            buf.append("    /*字段*/\n");
            buf.append(getFields(c));
            buf.append("    /*構造器*/\n");
            buf.append(getConstructors(c));
            buf.append("    /*方法*/\n");
            buf.append(getMethods(c));
            buf.append("}\n");
            System.out.println(buf.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws Exception{
         new Main().getClassMessage();
    }
}

輸出結果

/*類的聲明*/
public class com.test.Main extends java.lang.Object {
    /*字段*/
    /*構造器*/
    public com.test.Main();
    /*方法*/
    private java.lang.String getClassStatement (java.lang.Class);
    public void getClassMessage ();
    public static void main ([Ljava.lang.String;) throws java.lang.Exception;
    private java.lang.String getConstructors (java.lang.Class);
    private java.lang.String getFields (java.lang.Class);
    private java.lang.String getMethods (java.lang.Class);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM