今天给大家介绍下java反射技术
反射是什么,用最简单的语句来介绍反射就是加载类并解剖类的各个组成部分,稍有java基础的人都知道,java类在内存中是以字节码的形式存在的,而java中有一个Class类表示的正是某个类的字节码对象。大家查阅javaAPI可以发现这个类有个静态方法forName,它可以接收一个字符串作为类名,返回值正是此类名所表示的类的字节码对象,至此我们完成了反射技术中的第一步:加载类,也就是说我们成功的把一个我们指定的类加载到内存并且得到它的字节码对象。
那么在java中,到底有几种加载类得到类的字节码对象的方法呢,上面我们介绍的通过Class类的静态方法forName方法是一种,那还有没有其他的方法呢,下面我们就用代码的方式把加载类的几种方法给大家一一呈现:
package com.reflection;
public class ReflectionDemo {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
//第1种:调用Class类的静态方法foName加载并返回某个类的字节码对象
Class personClass1 = Class.forName("com.reflection.Person");
//第2种:调用Person对象的getClass方法也可以返回该类的字节码对象
Class personClass2 = new Person().getClass();
//第3种:直接使用Person.class也可以将Person类加载到内存并返回Person类的字节码对象
Class personClass3 = Person.class;
}
}
加载类只是反射技术的第一步,其实反射技术的核心是在第二步,那就是解剖类的各个组成部分,大家想一想,java类有几个组成部分呢,无非就是构造函数、字段和方法,所以,所谓的解剖类的各个组成部分,无非就是解剖出类的构造函数、字段或者是方法。下面我们就一一介绍怎样解剖出的类的这三个部分。
解剖类的构造方法
构造方法在java类中是一种特殊的方法,它的作用只有一个,就是用来创造对象,同样,反射机制解剖构造方法的作用也是为了用它创造对象,我们翻阅一下javaAPI的Class类的方法列表,不难发现他就有一个getConstructor方法,它接收一系列可变参数(关于java可变参数,不熟悉的读者可以先去掌握这部分知识),返回的是一个Constructor对象,里面封装的是一个构造函数,而Constructor对象有一个方法newInstance,同样接收一系类可变参数,返回值是Object类型,此Object类型即是我们反利用解剖出的构造方法创建的新对象。getConstructor只能解剖类的public类型的构造函数,对于private类型的构造函数,需要用到Class类的另外一个函数getDeclaredConstructor,接收的参数和返回值和getConstructor一样,接下来,我们就用代码演示下怎么解剖类的各种构造函数。
<