一. 创建对象
- 使用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);
}
}