A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

反射机制Array和 Class
动态创建对象Class<T>.newInstance(),
动态创建数组Array.newInstance(Class,int[]),
动态调用方法Method.invoke(Object,value[]),

动态创建数组和对象以及动态调用方法分别要如何实现,是不是用到了上面的三个方法,请高手详细解释下。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

正序浏览
本帖最后由 仉钰 于 2013-3-25 13:49 编辑

一  利用反射创建非数组对象有2个方法
1 如果提供了无参构造函数 可以使用 Class类中的  newInstance() 方法  创建对象  
2 如果没有无参的构造函数的话  就只能使用 Constructor 类来创建对象了  假如
Class XXX {
   public XXX(String s, Integer y)
   {}
}
Class<?> classType  = XXX.getClass();
Constructor<?> constructor = classType.getConstructor(String.class,int.class);
Object obj = constructor.newInstance(new Object[]{"hello",10});//   最后调用 Constructor中的 newInstance() 方法来创建对象


二  对于数组对象 来说

1 首先要明确数组中存放的数据类型 比如创建一个String 数组
Class<?>  classType = String.class;
2 创建一维数组
Object array = Array.newInstance(classType,10);

同样可以使用反射创建多维数组 使用另外一个重载函数   Array.newInstance(Class<?>componentType,int... dimensions)
具体使用 可以参考java文档  


三  方法的调用

使用 Method 中的  invoke(Object obj, Object... args)
其中 obj 是在哪个对象上调用方法

比如

Class XXX {
   public XXX(String s, Integer y) {}
   public int add( int x,int y )
  {
      return  x+y;
  }
}

例如反射调用add方法如下

//使用反射基本上第一步都是要得到 Class对象
Class<?> classType = XXX.getClass();
//得到add 对应的Method对象  第一个参数是方法的名称    第二个参数 是方法的参数类型 之所以有这个参数  是因为方法重载  仅仅依靠方法名是不能唯一确认某个方法的
Method addMethod = classType.getMethod("add",new Object[]{int.class,int.class})
//首先创建一个对象  表明在该对象上调用add 方法
XXX  xxx = (XXX) (classType.getConstructor(String.class,int.class).newInstance());
Object result =  addMethod.invoke(xxx,new Object[]{4,5});

利用反射调用方法的基本操作就完成了  还有更深入的操作  参考 文档     上面的代码中有一个错误  你可以找下  
回复 使用道具 举报
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马