Java机制API
Java反射机制API主要是 java.lang.Class类和java.lang.reflect包。
** java.lang.Class**类
java.lang.Class类是实现反射的关键所在,Class类的一个实例表示Java的一种数据类型,包括类、接口、枚举、注解(Annotation)、数组、基本数据类型和void,void是“无类型”,主要用于方法返回值 类型声明,表示不需要返回值。Class没有公有的构造方法,Class实例是由JVM在类加载时自动创建的。
每一种类型包括类和接口等,都有一个class静态变量可以获得Class实例。另外,每一个对象都有getClass()方法可以获得Class实例,该方法是由Object类提供的实例方法。
** java.lang.reflect**包
java.lang.reflect包提供了反射中用到类,主要的类说明如下:
Constructor类:提供类的构造方法信息。
Field类:提供类或接口中成员变量信息。
Method类:提供类或接口成员方法信息。
Array类:提供了动态创建和访问Java数组的方法。
Modifier类:提供类和成员访问修饰符信息。
创建对象
Java反射机制提供了另外一种创建对象方法,Class类提供了一个实例方法newInstance(),通过该方法可以创建对象。
调用构造方法
调用方法newInstance()创建对象,这个过程中需要调用构造方法,如果想要调用非默认构造方法,需要使用Constructor对象,它对应着一个构造方法,获得
Constructor对象需要使用Class类的如下方法:
Constructor[] getConstructors():返回所有公有构造方法Constructor对象数组。
Constructor[] getDeclaredConstructors():返回所有构造方法Constructor对象数组。
Constructor getConstructor(Class… parameterTypes):根据参数列表返回一个共有Constructor对象。参数parameterTypes是Class数组,指定构造方法的参数列表。
Constructor getDeclaredConstructor(Class… parameterTypes):根据参数列表返回一个Constructor对象。参数parameterTypes同上。
案例:依赖注入实现
package Annotation;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
public class HelloWorld1 {
public static void main(String[] args) {
try {
String className = readClassName();
Class clz = Class.forName(className);
Class[] params = new Class[3];
params[0] = String.class;
params[1] = int.class;
params[2] = String.class;
Constructor constructor = clz.getConstructor(params);
Object[] argObjs = new Object[3];
argObjs[0] = "Tony";
argObjs[1] = 18;
argObjs[2] = "清华大学";
Object p = constructor.newInstance(argObjs);
System.out.println(p);
}catch (Exception e){
e.printStackTrace();
}
}
private static String readClassName() {
FileInputStream readfile = null;
InputStreamReader ir = null;
BufferedReader in = null;
try {
readfile = new FileInputStream("Configuration.ini");
ir = new InputStreamReader(readfile);
in = new BufferedReader(ir);
String str = in.readLine();
return str;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
调用方法
通过反射机制还可以调用方法,这与调用构造方法类似。调用方法需要使用Method对象,它对应着一
个方法,获得Method对象需要使用Class类的如下方法:
Method[] getMethods():返回所有公有方法Method对象数组。
Method[] getDeclaredMethods():返回所有方法Method对象数组。
Method getMethod(String name, Class… parameterTypes):通过方法名和参数类型返回公有方法
Method对象。参数parameterTypes是Class数组,指定方法的参数列表。
Method getDeclaredMethod(String name, Class… parameterTypes):通过方法名和参数类型返回方法Method对象。参数parameterTypes同上。
调用成员变量
通过反射机制还可以调用成员变量,调用方法需要使用Field对象,它对应着一个方法,获得Field对象
需要使用Class类的如下方法:
Field[] getFields():返回所有公有成员变量Field对象数组。
Field[] getDeclaredFields():返回所有成员变量Field对象数组。
Field getField(String name):通过指定公共成员变量名返回Field对象。
Field getDeclaredField(String name):通过指定成员变量名返回Field对象。
小结
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。