您的位置:首页 > 编程语言 > Java开发

JAVA笔记【20131210】

2013-12-10 22:39 169 查看
一、反射(部分)

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(");");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息