- package cn.javastudy.p15.reflect.demo;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- public class ReflectDemo {
- public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException
- {
- Class clazz=Class.forName("cn.javastudy.p15.reflect.demo.person");
- Object obj=clazz.newInstance();
- Method m=clazz.getMethod("main", String[].class);
- //m.invoke(null, new String[]{"11","22","33"});//发生错误,因为invoke会把”new String[]{"11","22","33"}“
- //拆包,因为为了兼容jdk1.5以前的版本,在jdk1.5之后的这个函数是接收一个数组,而之后接收的是一个可变参数.所以此处会按以前的方式处理.拆包之后,
- // 发现类型不对,所以运行发生错误
- //m.invoke(null, (Object)new String[]{"11","22","33"});
- //此处会隐藏了数组的类型,变成了Object,会按可变参数形式传递,根据可变
- //参数的定义,隐示创建一个Object数组,接收传进来的可变参数,然后拆分后,发现Object数组元素是一个数组类型,传进main方法当然就不会出错了。
- m.invoke(null, new Object[]{new String[]{"11","22","33"}});
- //此处jdk1.5以前的数组形式形式传递并拆包,发现数组元素是一个数组类型,传进main方法当然就不会出错了。
- }
-
- }
- class person
- {
- private int age=20;
- public String name="张三";
- public static void main(String[] args)
- {
- for(String str:args)
- {
- System.out.println(str);
- }
- }
- }
复制代码 |