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 条评论