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
		

	}
}

 

版权声明:
作者:yfeer
链接:https://www.yfeer.com/870.html
来源:个人编程学习网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>