Java反射學習總結(三)

Class對象表示所加載的類,取得Class對象後,我們就可以愉快的取得與類相關的信息了,就像包(package,package也是類名的一部分哦~),構造方法,方法,屬性等信息,而每一個信息,也會有相應的類別形態,比如包對應的是 java.lang.Package,構造方法對應的是java.lang.reflect.Constructor,成員方法對應的是 java.lang.reflect.Method,屬性對應的是 java.lang.reflect.Field等。

先來個簡單的例子吧,獲取一下包名:

package CoreJava.day_2;

/**
 * @author 李智
 * @date 2016/12/4
 */
public class ClassInfoDemo {
    public static void main(String[] args) {
        try {
            Class c = Class.forName(args[0]);
            Package p = c.getPackage();
            System.out.println(p.getName());
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("沒有指定類");
        } catch (ClassNotFoundException e) {
            System.out.println("找不到指定類");
        }
    }
}

輸出:

java ClassInfoDemo java.util.ArrayList
java.util

用相應的方法,我們可以分別取得 Field、Constructor、Method等對象。

下面是一個我之前寫的可以獲取某些類信息的一個demo:

package CoreJava.day_2;

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

/**
 * @author 李智
 * @date 2016/12/1
 */
public class ReflectTest {
    public static void main(String[] args) {
        String name;
        if (args.length > 0) {
            name = args[0];
        } else {
            Scanner in = new Scanner(System.in);
            System.out.println("輸入類名:(例如:java.util.Date)");
            name = in.next();
        }

        try {
            Class c1 = Class.forName(name);
            Class superc1 = c1.getSuperclass();
            String modifiers = Modifier.toString(c1.getModifiers());
            if (modifiers.length() > 0) {
                System.out.print(modifiers + "");
            }
            System.out.print("class " + name);
            if (superc1 != null && superc1 != Object.class) {
                System.out.print(" extends" + superc1.getName());
            }
            System.out.print("\n{\n");
            printConstructors(c1);
            System.out.println();
            printMethods(c1);
            System.out.println();
            printFields(c1);
            System.out.println("}");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.exit(0);
    }

    public static void printConstructors(Class c1) {
        Constructor[] constructors = c1.getDeclaredConstructors();
        for (Constructor c : constructors) {
            String name = c.getName();
            System.out.print("");
            String modifers = Modifier.toString(c.getModifiers());
            if (modifers.length() > 0) {
                System.out.print(modifers + " ");
            }
            System.out.print(name + "(");
            Class[] paramTypes = c.getParameterTypes();
            for (int j = 0; j < paramTypes.length; j++) {
                if (j > 0) {
                    System.out.print(",");
                }
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }

    public static void printMethods(Class c1) {
        Method[] methods = c1.getDeclaredMethods();
        for (Method m : methods) {
            Class retType = m.getReturnType();
            String name = m.getName();

            System.out.print(" ");
            String modifiers = Modifier.toString(m.getModifiers());
            if (modifiers.length() > 0) {
                System.out.print(modifiers + " ");
            }
            System.out.print(retType.getName() + " " + "(");
            Class[] paramTypes = m.getParameterTypes();
            for (int j = 0; j < paramTypes.length; j++) {
                if (j > 0) {
                    System.out.print(",");
                }
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }

    public static void printFields(Class c1) {
        Field[] fields = c1.getDeclaredFields();
        for (Field f : fields) {
            Class type = f.getType();
            String name = f.getName();
            System.out.print(" ");
            String modifiers = Modifier.toString(f.getModifiers());
            if (modifiers.length() > 0) {
                System.out.print(modifiers + " ");
            }
            System.out.println(type.getName() + " " + name + ";");
        }
    }
}

輸出:

輸入類名:(例如:java.util.Date)
java.util.Date
publicclass java.util.Date
{
public java.util.Date(java.lang.String);
public java.util.Date(int,int,int,int,int,int);
public java.util.Date(int,int,int,int,int);
public java.util.Date();
public java.util.Date(long);
public java.util.Date(int,int,int);

 public boolean (java.lang.Object);
 public java.lang.String ();
 public int ();
 public java.lang.Object ();
 public int (java.util.Date);
 public volatile int (java.lang.Object);
 private void (java.io.ObjectInputStream);
 private void (java.io.ObjectOutputStream);
 private final sun.util.calendar.BaseCalendar$Date ();
 private final sun.util.calendar.BaseCalendar$Date (sun.util.calendar.BaseCalendar$Date);
 public static long (java.lang.String);
 public boolean (java.util.Date);
 public boolean (java.util.Date);
 public int ();
 public void (int);
 public int ();
 public void (int);
 public void (int);
 public int ();
 public int ();
 public void (int);
 public int ();
 public void (int);
 public int ();
 public void (int);
 private final long ();
 static final long (java.util.Date);
 private static final java.lang.StringBuilder (java.lang.StringBuilder,java.lang.String);
 public java.lang.String ();
 public java.lang.String ();
 public int ();
 private final sun.util.calendar.BaseCalendar$Date ();
 private static final sun.util.calendar.BaseCalendar (sun.util.calendar.BaseCalendar$Date);
 private static final sun.util.calendar.BaseCalendar (long);
 private static final sun.util.calendar.BaseCalendar (int);
 private static final synchronized sun.util.calendar.BaseCalendar ();
 public java.time.Instant ();
 public static long (int,int,int,int,int,int);
 public static java.util.Date (java.time.Instant);
 public int ();
 public void (long);
 public long ();

 private static final sun.util.calendar.BaseCalendar gcal;
 private static sun.util.calendar.BaseCalendar jcal;
 private transient long fastTime;
 private transient sun.util.calendar.BaseCalendar$Date cdate;
 private static int defaultCenturyStart;
 private static final long serialVersionUID;
 private static final [Ljava.lang.String; wtb;
 private static final [I ttb;
}

Process finished with exit code 0

輸入一個類(完整的類名),即可打印該類的略爲完整信息。當然還有一些不知道的,可以查看API來完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章