一、概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
二、通过Class类对象获取构造方法对象
方法名 | 说明 |
Constructor[] getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor[] getDeclaredConstructors() | 返回所有公共构造方法对象的数组 |
Constructor[] getDeclaredConstructors() | 返回所有公共构造方法对象的数组 |
Constructor getDeclaredConstructor(Class… parameterTypes) | 返回所有公共构造方法对象的数组 |
1、创建一个类(写入成员变量、构造方法、成员方法)
public class BookServiceImpl implements BookService {
//成员变量
public String name;
private String age;
protected int year;
double price;
//构造方法
public BookServiceImpl() {
}
public BookServiceImpl(String name, String age) {
this.name = name;
this.age = age;
}
protected BookServiceImpl(String name) {
this.name = name;
}
private BookServiceImpl(String name, String age, int year, double price, BookDao bookDao) {
this.name = name;
this.age = age;
this.year = year;
this.price = price;
this.bookDao = bookDao;
}
//成员方法
public int vion(int n,String s){
return 0;
}
private String fun(int n){
return "";
}
}
2、方法的使用
public class Test01 {
public static void main(String[] args) throws Exception {
//通过全类名加载类的Class对象
Class cla = Class.forName("com.dou.service.impl.BookServiceImpl");
//Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法
//获取类里面的所有被public修饰的构造方法---获取被公共的修饰符修饰的构造方法
Constructor[] constructors = cla.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
System.out.println("----------------------------------------");
//获取类里面的所有的构造方法---获取类里面所有的构造方法
Constructor[] declaredConstructors = cla.getDeclaredConstructors();
for (Constructor declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
}
}
输出结果如下:
三、通过Class类对象获取成员变量对象
方法名 | 说明 |
Field[] getFields() | 返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
方法的示例代码:
public class Test01 {
public static void main(String[] args) throws Exception {
//通过全类名加载类的Class对象
Class cla = Class.forName("com.dou.service.impl.BookServiceImpl");
//Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法
//获取类里面的公共属性---只能获取public修饰的属性
Field[] fields = cla.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("----------------------------------");
//获取类里面的所有属性(public、private、protected、默认属性)
Field[] declaredFields = cla.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("-----------------------------------");
//根据name获取公共的成员方法
Field name = cla.getDeclaredField("name");
System.out.println(name);
//根据age获取成员方法(可以获取到被所有修饰符修饰的成员变量)
Field age = cla.getDeclaredField("age");
System.out.println(age);
}
}
输出结果如下:
四、通过class类对象获取成员方法对象
方法名 | 说明 |
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
方法的示例代码:
public class Test01 {
public static void main(String[] args) throws Exception {
//通过全类名加载类的Class对象
Class cla = Class.forName("com.dou.service.impl.BookServiceImpl");
//Class对象可以认为是类的手术刀,可以解刨类里面的东西--属性、构造器、方法
//获取类里面所有被public修饰符修饰的方法
Method[] methods = cla.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("----------------------------------------------");
//获取类里面所有的方法
Method[] declaredMethods = cla.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
}
}
输出结果如下:
五、通过 .properties配置执行对应的方法
实现代码如下:
1、创建 info.properties文件
className=com.dou.service.impl.BookServiceVip
methodName=fun
2、创建测试类
public class Test03 {
public static void main(String[] args) throws Exception {
//1.加载ser根目录下的 info.properties 文件
InputStream stream = Test03.class.getClassLoader().getResourceAsStream("info.properties");
//2.实例化工具包对象
Properties properties = new Properties();
//3.加载stream流对象
properties.load(stream);
//4.根据key获取对应的值
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");
//5.通过全类名获取类的Class对象
Class cla = Class.forName(className);
//6.通过Class对象获取类的无参构造器
Constructor constructor = cla.getDeclaredConstructor();
//7.使用构造器创建对象
BookService bookService = (BookService) constructor.newInstance();
//8.获取方法名
Method method = cla.getDeclaredMethod(methodName);
//9.执行方法
method.invoke(bookService);
}
}
输出结果如下: