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來完成。