使用反射来调用类方法
假设有类A,A中有三个同名方法分别是
- print();
- print(int, int);
- print(String, String);
- 获取的类的类类型
A a = new A();
Class c = a.getClass();
- 通过类类型获取方法,传入参数(方法名,参数数组),如果方法没有参数,可以传入空的参数数组或者直接不传入,可能抛出异常,因为方法可能不存在
try{
// Method m = c.getMethod("方法名", new Class[]{p1.class, p2.class···});
// 或者
// Method m = c.getMethod("方法名", p.class, p2.class···);
Method m = c.getMethod("print", int.class, int.class);
}catch(Exception e){
e.printStackTrace();
}
- 用m调用方法
// m.invoke(Object obj, parameter);
m.invoke(a, 10, 10);
// 或者
m.invoke(a, new Object[]{10, 10});
ClassDemo4.java
package com.immoc.reflect;
import java.lang.reflect.Method;
public class ClassDemo4 {
public static void main(String []args) {
A a = new A();
// 获取的A类的类类型
Class class1 = a.getClass();
try {
// 获取print(int, int) 方法
// Method m1 = class1.getMethod("print", new Class[] {int.class, int.class});
Method m1 = class1.getMethod("print", int.class, int.class);
// m1.invoke(a, 10, 20);
m1.invoke(a, new Object[]{10, 20});
// 获取print(String, String)方法
// Method m2 = class1.getMethod("print", String.class, String.class);
Method m2 = class1.getMethod("print", new Class[] {String.class, String.class});
m2.invoke(a, "hello", "WORLD");
// 获取print()方法
// Method m3 = class1.getMethod("print", new Class[]{});
Method m3 = class1.getMethod("print");
m3.invoke(a);
}catch (Exception e) {
e.printStackTrace();
}
}
}
class A{
public void print() {
System.out.println("Hello World");
}
public void print(int a, int b) {
System.out.println(a+b);
}
public void print(String a, String b) {
System.out.println(a.toUpperCase() + "," + b.toLowerCase());
}
}