JAVA筆記【20131210】

一、反射(部分)

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(");");
		}
	}
}












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