2.反射生成并操作对象

一. 创建对象

  • 使用Class对象的newInstance()方法创建该Class对象的实例,此时该Class对象必须要有无参构造方法.
  • 使用Class对象获取指定的Constructor对象,在调用Constructor的newInstance()方法创建对象类的实例,此时可以选择使用某个构造方法.

新建类CreateDemo

//创建对象
public class CreateDemo {
	public static void main(String[] args) throws Exception {
		Class<Date> clz = Date.class;//得到Class实例
		Date d1 = clz.newInstance();//创建对象的实例
		Constructor<Date> con = clz.getConstructor(long.class);
		Date d2 = con.newInstance(System.currentTimeMillis());
	}
}

二. 调用方法

Method类

  • public Object invoke(Object obj,Object… ages):对带有指定参数的指定对象调用由此Method对象表示的底层方法.
    • obj表示调用底层方法的对象,后面的args表示传递的实际参数
    • 如果底层方法是静态的,那么可以忽略指定的obj参数.该参数可以为null
    • 如果底层方法所需的形参个数为0,则所提供的args数组长度可以为:不写,null,或new Object[]{}.
    • 若底层方法需要的是数组型参数,则必须对参数使用Object的一维数组包装后再传递.

AccessibleObject对象的setAccessible(boolean flag)方法,当flag为true的时候,就会忽略访问权限(可以访问私有的成员)

反射调用静态可变参数

创建类MethodInvokeDemo2

//反射调用静态可变参数
class Employee{
	//int类型可变参数
	public static void doWork(int... arr) {
		System.out.println("int... arr 被调用, " + Arrays.toString(arr) );
	}
	//String类型可变参数
	public static void doWork(String...arr) {
		System.out.println("String...arr 被调用, " + Arrays.toString(arr));
	}
}
public class MethodInvokeDemo2 {
	public static void main(String[] args) throws Exception {
		//获取类实例 包名
		Class clz = Class.forName("com.huangkuh.method.Employee");
		//获取方法
		Method m = clz.getDeclaredMethod("doWork",int[].class);
		m.setAccessible(true);
		//调用方法 因为属于类,null即可  需要用Object数据包一层
		Object res = m.invoke(null, new Object[] {new int[] {2,3,4,2544,53,4,3,4,32,6}});
		System.out.println("\n---------String类型可变参数-------------");
		//调用并返回结果*
		res = clz.getDeclaredMethod("doWork",String[].class).invoke(null, new Object[] {new String[] {"你好","无不好"}});
		System.out.println(res);
	}
}
发布了82 篇原创文章 · 获赞 0 · 访问量 1328

猜你喜欢

转载自blog.csdn.net/huang_kuh/article/details/105490969