通过反射调用类中方法
package reflection;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
try {
Class<?> c = Class.forName("reflection.Car");
Object obj = c.newInstance();
Method m = c.getMethod("printf", String.class);
System.out.println(m.invoke(obj, "is this a car?"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
package reflection;
public class Car {
public static void print() {
System.out.println("This is a car");
}
public String printf(String s) {
return s;
}
}
Class<?> c = Class.forName("reflection.Car");
,首先获取类信息,注意不要忘记写包名Object obj = c.newInstance();
Class类的newInstance()方法是使用该类无参的构造函数创建对象。如果一个类没有无参的构造函数,可以调用Class类的getConstructor(),
参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组,然后在用Constructor对象调用newInstance()并填入相应的形参。Method m = c.getMethod("printf", String.class);
获取方法,前一个参数是方法名,后面的参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组,没有可以不写。m.invoke(obj, "is this a car?")
,调用invoke()传入调用方法的对象和参数。
调用静态方法
package reflection;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
try {
Class<?> c = Class.forName("reflection.Car");
Method m = c.getMethod("print");
m.invoke(null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 过程和调用非静态方法类似,不用获取对象
- 获取方法后调用invoke()时第一个参数传入null即可