Java-使用发射调用静态方法和数组参数
使用反射调用静态方法:
静态方法不属于任何对象,静态方法属于类本身.
此时把invoke方法的第一个参数设置为null即可.
static public void doWork(String name){
System.out.println("Person.doWork()" + name);
}
m = clz.getMethod("doWork",String.class);
ret = m.invoke(null,"Lucy");
--------------------------------------------------------------------------------
使用反射调用数组参数(可变参数):
王道:调用方法的时候把实际参数统统作为Object数组的元素即可.
Method对象.invoke(方法底层所属对象,new Object[]{ 所有实参 });
--------------------------------------------------------------------------------
class Employee {
public void work1(int... arr) {
System.out.println("work1" + Arrays.toString(arr));
}
public static String work2(String... arr) {
System.out.println("work2" + Arrays.toString(arr));
return "a";
}
public static <T> List<T> asList(T...a){
return null ;
}
}
public class MethodInvokeDemo2 {
public static void main(String[] args) throws Exception {
Class clz = Employee.class;
//泛型方法的获得 (T只是占位符,底层还是Object)
Method method2= clz.getMethod("asList", Object[].class);
System.out.println(method2);
// 数组的元素是基本类型
Method m = clz.getMethod("work1", int[].class);
Object ret = m.invoke(clz.newInstance(), new int[] { 1, 2, 2 });
Object ret1 = m.invoke(clz.newInstance(), new Object[] { new int[] { 1,
2, 3, 4, 5 } });
System.out.println(ret); // 返回null
// 数组的元素类型是引用类型(引用类型的数组会自动解包)
m = clz.getMethod("work2", String[].class);
Object ret2 = m.invoke(null, new Object[] { new String[] { "a", "b",
"c" } });
System.out.println(ret2);//返回为2
}
}
共有 0 条评论