- Java的反射机制是做什么的?
主要功能就是可以根据一个类的名称来创建一个类的实例,并调用实例的方法。
我们通常情况下创建一个类实例的方法,就是new ABC()这样的方式来创建,那为什么还要用反射绕一大圈呢?因为反射可以让ABC这个具体的类,在运行的时候指定,例如可以通过传参的方式指定进来,比如我们传一个参数ABC就可以创建ABC这个类,也可以传递其他参数来创建DEF这个类。 - 怎么做?
直接贴代码
package com;
import java.lang.reflect.Method;
public class Test {
public int add500(int a) {
return a + 500;
}
public static void main(String[] args) {
//第一步:创建Test类的实例
String className = "com.Test";//className需要写完整路径
Class clazz = null;
try {
clazz = Class.forName(className);//通过类名创建一个Class对象(把这个类的信息加载到内存里)
Test newInstance = (Test) clazz.newInstance();//这个newInstance就是Test的实例了
//第二步:调用Test类的add500方法
Method method = clazz.getMethod("add500", int.class);//根据方法名(add500)和参数类型(int)获取对应的Method对象
Integer result = (Integer) method.invoke(newInstance, 123);
//这个invoke,是用来调用方法的,传入的是类的实例和参数值,invoke返回的是那个调用方法的返回值
System.out.println("123+500=" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
PS:关于大小写class,”class”是java的关键字,用来定义一个类的;而”Class”本身就是一个类,用来实现和类相关的操作,比如类加载等。
PS2:关于”Class.forName”,实际包含3个操作:loading(装载),linking(连接)和initializing(实例化)
3. 获取所有定义的方法:
感谢网友wangfan_work的补充,可以采用getDeclaredMethod()来获取的是类自身声明的所有方法,包含public、protected和private方法。
当此方法是private等修饰导致没有访问权限时,还得压制访问权限setAccessible(true);
而getMethod()获取的是类的所有共有方法,也就是自身的所有public方法和从基类继承的、从接口实现的所有public方法。