java重复代码反射 java 类重复( 二 )


System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
还可以使用一个类字面值(JLS Section 15.8.2)来获取指定类型(或 void)的 Class 对象 。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
在没有对象实例的时候,主要有两种办法 。
//获得类类型的两种方式
Class cls1 = Role.class;
Class cls2 = Class.forName("yui.Role");
注意第二种方式中,forName中的参数一定是完整的类名(包名+类名),并且这个方法需要捕获异常 。现在得到cls1就可以创建一个Role类的实例了 , 利用Class的newInstance方法相当于调用类的默认的构造器 。
Object o = cls1.newInstance();
//创建一个实例
//Object o1 = new Role();//与上面的方法等价
java反射机制的实现原理反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力 。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备 。下面具体介绍一下java的反射机制 。这里你将颠覆原来对java的理解 。
Java的反射机制的实现要借助于4个类:class,Constructor , Field,Method;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象 。通过这四个对象我们可以粗略的看到一个类的各个组 成部分 。
Class:程序运行时,java运行时系统会对所有的对象进行运行时类型的处理 。这项信息记录了每个对象所属的类,虚拟机通常使用运行时类型信息选择正 确的方法来执行(摘自:白皮书) 。但是这些信息我们怎么得到啊 , 就要借助于class类对象了啊 。在Object类中定义了getClass()方法 。我 们可以通过这个方法获得指定对象的类对象 。然后我们通过分析这个对象就可以得到我们要的信息了 。
比如:ArrayList arrayList;
Class clazz = arrayList.getClass();
然后我来处理这个对象clazz 。
当然了Class类具有很多的方法,这里重点将和Constructor,Field , Method类有关系的方法 。
Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性 。Java 的这一能力在实际应用中也许用得不是很多 , 但是个人认为要想对java有个更加深入的了解还是应该掌握的 。
1.检测类:
reflection的工作机制
考虑下面这个简单的例子,让我们看看 reflection 是如何工作的 。
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName(args[0]);
Method m[] = c.getDeclaredMethods();
for (int i = 0; im.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}
按如下语句执行:
java DumpMethods java.util.ArrayList
这个程序使用 Class.forName 载入指定的类,然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表 。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类 。
Java类反射中的主要方法
对于以下三类组件中的任何一类来说 -- 构造函数、字段和方法 -- java.lang.Class 提供四种独立的反射调用,以不同的方式来获得信息 。调用都遵循一种标准格式 。以下是用于查找构造函数的一组反射调用:
Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数 , 
Constructor[] getConstructors() -- 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

推荐阅读