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(");");
}
}
}
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(");");
}
}
}
相关文章推荐
- java 设计模式学习笔记十二 command命令设计模式
- Java学习笔记_1_字符的读入
- java之jvm学习笔记十三(jvm基本结构)
- 【JAVA WEB】学习笔记——HTTP协议
- Kafka学习笔记-Java简单操作
- 新手JAVA学习笔记2——解读构造器
- Java学习笔记-8.多线程编程
- 循序渐进学java基础笔记(4) —— 编译和java程序的运行关系
- JAVA学习笔记(四)
- [原]Java多线程编程学习笔记之八:死锁(含代码)
- Java学习笔记
- java笔记-多态
- 数据结构与算法分析笔记与总结(java实现)--链表6:两个链表找公共结点问题
- java 学习笔记 1
- 【java编程思想笔记】第三章—操作符
- java 反射机制-学习笔记(6)
- Java网络编程---I/O部分学习笔记整理
- Java学习第一天笔记
- JAVA 基础笔记|多线程的实现方法
- [Java]复习笔记(二)--环境变量