(十七)、反射的用途及实现
1、什么是Java类中的反射?
当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。
我们认为 Java 并不是动态语言,但是它却又一个非常突出的动态相关的机制,俗称:反射。Reflection 是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类和对象的内部属性。
通过反射,我们可以在运行时获得程序或程序集中每一个类型成员和成员变量的信息。
程序中一般的对象类型都是在编译期就确定下来的,而Java 反射机制可以动态的创建对象并调用其属性,这样对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象即使这个对象在编译期是未知的,
程序中一般的对象类型都是在编译期就确定下来的,而Java 反射机制可以动态的创建对象并调用其属性,这样对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象即使这个对象在编译期是未知的,
反射的核心:是 JVM 在运行时 才动态加载的类或调用方法或属性,他不需要事先(写代码的时候或编译期)知道运行对象是谁。
2、Java反射框架提供一下功能:
A.在运行时判断任意一个对象所属的类
B.在运行时构造任意一个类的对象
C.在运行时判断任意一个类所具有的成员变量和方法(通过反射设置可以调用private)
D.在运行时调用人一个对象的方法
3、放射的主要用途
很多人都认为反射在实际Java中开发应用中并不广泛,其实不然。
当我们在使用 IDE(如 Eclipse\IDEA)时,当我们输入一个队长或者类并向调用它的属性和方法时,一按 (“.”)点号,编译器就会自动列出她的属性或方法,这里就会用到反射。
当我们在使用 IDE(如 Eclipse\IDEA)时,当我们输入一个队长或者类并向调用它的属性和方法时,一按 (“.”)点号,编译器就会自动列出她的属性或方法,这里就会用到反射。
反射最重要的用途就是开发各种通用框架。
很多框架(比如 Spring)都是配置化的(比如通过 XML文件配置 JavaBean,Action之类的),为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
4、反射的基本运用
以上我们提到了反射可以拟用于判断任意对象所属的类,获得 Class对象,构造人一个对象以及调用一个对象。这里我们介绍一下基本反射功能的实现(反射相关类一般都在 java.lang.relfect包里)。
第一步、获得Class对象
a.使用Class类的forName()静态方法:
public static Class <?> forName(String className) ... //在JDBC开发中常用此方法加载数据库驱动 ... Class.forName(Driver)
b.直接获取某一个对象的class,比如:
Class<?> class = int.class; Class<?> classInt = Integer.TYPE;
c.调用某个对象的getClass()方法,比如:
StringBuilder str = new StringBuilder("123"); Class<?> class = str.getClass();
第二步、判断是否为某个类的实例
一般地,我们用 instanceof关键字来判断是否为某个类的实例。同时我们也可以借助反射中Class对象的 isInstance()方法来判断是否为某个类的实例,它是一个 Native 方法:
public native boolean isInstance(Object obj);
第三步、创建实例
先通过 Class 对象获取制定的 Constructor 对象,在调用 Constructor 对象的 newInstance() 方法来创建实例。这种方法可以用指定的构造器构造类的实例。
//获取String所对应的Class对象 Class<?> c = String.class; //获取String类带一个String参数的构造器 Constructor constructor = c.getConstructor(String.class); //根据构造器创建实例 Object obj = constructor.newInstance("23333"); System.out.println(obj);
很想高飞,但我不能;不想天空,剩我一人。