认识反射机制
在Java语言中之所以有如此多的开源技术支撑,很大一部分是来自于Java最大的特征–反射机制。如果现在不能够灵活的使用反射机制进行项目开发与设计,那么可以说并未接触到Java的精髓所在。
所有的技术实现的目标只有一点:重用性
反射机制简介
对于反射技术首先来考虑的是反与正的概念。所谓的“正”操作指的是当我们要使用一个类的时候一定是要先导入程序所在的包,而后根据类进行对象的实例化,并且依靠对象调用类中的方法。但是如果说“反”,根据实例化对象反推出其类型。
正向操作
import java.util.Date; //导入程序所在的包,知道对象的出处
public class test {
public static void main(String[] args) {
Date date = new Date(); //通过类产生实例化对象
System.out.println(date.getTime()); //使用方法
}
}
要想实现反的处理操作,那么首先要采用的就是Object类中所提供的一个操作方法:
- 获取Class信息:
public final Class<?> getClass();
观察Class对象的使用
package java_study_aliyun.Basic;
import java.util.Date; //导入程序所在的包,知道对象的出处
public class test {
public static void main(String[] args) {
Date date = new Date(); //通过类产生实例化对象
System.out.println(date.getClass()); //通过实例化对象找到对象的所属类型
}
}
getClass()可以帮助使用者找到对象的根源。
Class类对象的三种实例化模式
反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类如果想要获取它的实例化对象,可以采用三种方式完成,观察java.lang.Class类的定义:public final class Class<T> extends Object implements Serializable,GenericDeclaration,Type,AnnotatedElement;
自JDK1.5开始Class类在定义时可以使用泛型进行标记,这样的用法主要是希望可以避免所谓的向下转型。通过具体操作讲解三种实例化形式。
- 【Object类支持】Object类可以根据实例化对象获取Class类对象:
public final Class<?> getClass();
package java_study_aliyun.Basic;
import java.util.Date; //导入程序所在的包,知道对象的出处
class Person{
}
public class test {
public static void main(String[] args) {
Person per = new Person();
Class<? extends Person> cls = per.getClass();
System.out.println(cls);
System.out.println(cls.getName()); //获取类的完整名称
}
}
- 这种方式有一个不是缺点的缺点:如果现在只是想获得Class类对象,则必须产生指定类对象后才可以获得。
- 【JVM直接支持】采用“类.class”的形式直接实例化
package java_study_aliyun.Basic;
import java.util.Date; //导入程序所在的包,知道对象的出处
class Person{
}
public class test {
public static void main(String[] args) {
Class<? extends Person> cls = Person.class;
System.out.println(cls);
System.out.println(cls.getName()); //获取类的完整名称
}
}
- 如果要采用此种模式必须导入程序对应的开发包。
- 【Class类支持】在Class类中提供一个static方法:
public static Class<?> forName(String className) throws ClassNotFoundException
package java_study_aliyun.Basic;
public class test {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> cls = Class.forName("java.util.Date");
System.out.println(cls);
System.out.println(cls.getName()); //获取类的完整名称
}
}
- 这种模式最大的特点是直接采用字符串的形式定义要使用的类型,并且程序中不需要编写import语句。
- 如果此时要使用的程序类不存在,则会抛出“java.lang.ClassNotFoundException”