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












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值