一、反射(部分)
Class類:
Java運行時系統始終爲所有的對象維護着一個被稱爲運行時的類型標識。這個信息保存着每個對象所屬的類足跡。虛擬機利用運行時信息選擇相應的方法執行。
保存這些信息的類被稱爲Class。
獲取Class類信息的方法
1、Object類的getClass方法將返回對象Class的一個實例。
Employee e ;
//...........
Class temp = e.getClass(); //Class實例
System.out.println(temp); //輸出“class Employee”
2、使用靜態方法forName獲得字符串對應的Class對象。
String tempN = "java.util.Date";
Class temp = Class.forName(tempN); //如果字符串tempN內不是一個有效的類,則執行該方法會拋出異常
System.out.println(temp); //輸出“class java.util.Date”
3、T.class代表與T類型匹配的類對象。
Class temp1 = java.util.Date.class ;
System.out.println(temp1); //輸出"class java.util.Date"
Class temp2 = int.class ;
System.out.println(temp2); //輸出"int" 由於int不是類,輸出的不帶class
Class temp1 = Double.class;
System.out.println(temp3); //輸出"class [Ljava.lang.Double" 這樣的輸出是由歷史原因造成多輸出了[L
由於Java虛擬機爲每一個類型管理了一個Class對象。因此可以使用“==”實現兩個類對象的比較操作
if(e.getClass()==Employee.class)
也可以調用newInstance方法,快速創建一個類的實例
Employee temp = e.getClass.newInstance();
該方法會調用類默認的構造器(無參構造器)來初始化對象,如果在類中沒有找到默認的構造器,則會拋出異常。
使用反射分析類的能力:
在java.lang.reflect包中有Field,Method,Constructor分別用於描述類的域、方法和構造器,各個類中也提供了相應的方法獲取修飾符、返回值、參數類型、域名以及方法名等。
import java.lang.reflect.*;
import java.util.*;
public class Test24
{
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("Enter a Class name?");
name = in.next();
}
try
{
Class tempClass = Class.forName(name);
Class suptempClass = tempClass.getSuperclass();
System.out.print(tempClass);
if(suptempClass != null && suptempClass != Object.class)
System.out.print(" extends "+suptempClass);
System.out.println("\n{");
printConstructors(tempClass);
printMethods(tempClass);
printFields(tempClass);
System.out.println("}");
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
System.exit(0);
}
static void printFields(Class temp)
{
Field[] fields = temp.getDeclaredFields();
for(Field f:fields)
{
String name = f.getName();
String type = f.getType().getName();
System.out.print(" "+Modifier.toString(f.getModifiers()));
System.out.println(" "+type+" "+name+";");
}
}
static void printConstructors(Class temp)
{
Constructor[] constor = temp.getDeclaredConstructors();
for(Constructor c:constor)
{
String name = c.getName();
System.out.print(" "+Modifier.toString(c.getModifiers()));
System.out.print(" "+name+"(");
Class[] tempCtype = c.getParameterTypes();
for(int j=0;j<tempCtype.length;j++)
{
if(j>0)
System.out.print(",");
System.out.print(tempCtype[j].getName());
}
System.out.println(");");
}
}
static void printMethods(Class temp)
{
Method[] meth = temp.getDeclaredMethods();
for(Method me:meth)
{
String name=me.getName();
System.out.print(" "+Modifier.toString(me.getModifiers()));
System.out.print(" "+me.getReturnType().getName()+" "+name+"(");
Class[] tempCtype = me.getParameterTypes();
for(int j=0;j<tempCtype.length;j++)
{
if(j>0)
System.out.print(",");
System.out.print(tempCtype[j].getName());
}
System.out.println(");");
}
}
}