Class 类介绍
对象是对客观事物的抽象,是一个自我包含的组件,它包含能够使得某一类型的数据有用所需要的属性和方法。 对象的属性是指它所知道的,而对象的方法是指它所能做到的。类是对象的抽象,对象是类的具体实例。
在 wikipedia 中是这样定义 Reflection 的:
In computer science, reflection is the ability of a computer program to examine, introspect, and modify its own structure and behavior at runtime.
在程序运行期间, Java 运行时系统始终为所有的对象维护一个被称为运行时的类型标识,以便动态操作 Java 代码 (反射)。这个信息跟踪每个对象所属的类。保存这些信息的类称作 class 类。
那么这个保存信息的类的实例对象如何表示?这个实例对象有三种表示方式
Class c1 = Foo.class;
// 实际上告诉我们任何一个类都有一个隐含的静态成员变量 classClass c2 = foo1.getClass();
// 已经知道该类的对象通过 getClass 方法获得,c1、c2 表示了 Foo 类的信息(class type)Class c3 = null;
c3 = Class.forName("类的全称");
我们可以通过类的 class 类创建该类的对象实例:Foo foo = (Foo)c1.newInstance();
动态加载类与静态加载类
动态加载指运行时加载,而静态加载指在编译时就确定。
Class.forName(“类的全称”)不仅表示类的类类型,还代表了动态加载类
new 创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类。
获取类的信息
要想得到类的信息,首先要获取类的类类型。
方法的反射 方法是 java.lang.reflect.Method 类对象,一个成员方法就是一个 Method 对象。方法的名称和参数列表才能唯一决定某个方法。方法的反射操作是指 method.invoke(对象,参数列表) 来调用方法
成员变量的反射 成员变量是 java.lang.reflect.Field 类对象,Field 类封装了关于成员变量的操作
构造函数的反射 构造函数是 java.lang.Constructor 类对象, Constructor 类封装了关于构造函数的操作。
注:Java 中集合的泛型,是防止错误输入的,只在编译阶段有效,经过编译无效。利用方法反射就可以绕过编译。