黑马程序员技术交流社区

标题: 反射中是不是没有自动拆箱和装箱 [打印本页]

作者: student    时间: 2013-6-2 19:09
标题: 反射中是不是没有自动拆箱和装箱
本帖最后由 student 于 2013-6-3 18:55 编辑

下面的例子,int.class改为integer.class会抛出异常。

问题:是不是反射中不能自动拆箱和装箱呢?注释部分是反射获得构造方法的正确写法
  1. package com.demo;

  2. import java.lang.reflect.Constructor;

  3. class Student {
  4.         private String name;
  5.         private int age;
  6.         
  7.         public Student(String name, int age) {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11. }

  12. public class Demo {
  13.         public static void main(String[] args) throws Exception {

  14.                 //获得字节码
  15.                 Class cla = Class.forName("com.demo.Student");
  16.                
  17.                 //正确的写法:获得构造方法
  18. //                Constructor<Student> cons = cla.getConstructor(String.class, int.class);
  19.                
  20.                 //错误的写法:获得构造方法
  21.                 Constructor<Student> cons = cla.getConstructor(String.class, Integer.class);
  22.                 //创建实例对象
  23.                 Student stu = cons.newInstance("Student", 23);
  24.         }
  25. }
复制代码



作者: peerless2012    时间: 2013-6-2 22:59
  1. 用反射的方法执行某个类中的main方法
  2.    一般调用:类名.main(new String[]{"a","b","c"});
  3.    反射调用:
  4.        String startingClassName=args[0];//类名参数是自定义的
  5.        Method mainMethod=Class.forName(startingClassName).getMethod("main",String[].class);
  6.        //mainMethod.invoke(null,new Object[]{new String[]{"a","b","c"}});
  7.        mainMethod.invoke(null,(Object)new String[]{"a","b","c"});//因为编译器会自动把数组对象拆成数组元素,所以要将数组对象强制转变成Object对象,欺骗编译器。
复制代码

作者: 刘海芳    时间: 2013-6-3 09:24
在反射中,如果参数是基础类型,如果在反射方法中想使用基础类型的包装类,不是用class关键字,而是用TYPE关键字的。所以:如果把:
Constructor<Student> cons = cla.getConstructor(String.class, Integer.class);
改为:
Constructor<Student> cons = cla.getConstructor(String.class, Integer.TYPE);

代码:
  1. package com.demo;

  2. import java.lang.reflect.Constructor;

  3. class Student {
  4.         private String name;
  5.         private int age;
  6.         
  7.         public Student(String name, int age) {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11. }

  12. public class Demo {
  13.         public static void main(String[] args) throws Exception {

  14.                 //获得字节码
  15.                 Class cla = Class.forName("com.demo.Student");
  16.                
  17.                 //正确的写法:获得构造方法
  18. //                Constructor<Student> cons = cla.getConstructor(String.class, int.class);
  19.                
  20.                 //错误的写法:获得构造方法
  21.                 Constructor<Student> cons = cla.getConstructor(String.class, Integer.TYPE);
  22.                 //创建实例对象
  23.                 Student stu = cons.newInstance("Student", 23);
  24.         }
  25. }
复制代码

作者: student    时间: 2013-6-3 14:43
刘海芳 发表于 2013-6-3 09:24
在反射中,如果参数是基础类型,如果在反射方法中想使用基础类型的包装类,不是用class关键字,而是用TYPE ...

嗯嗯,原来如此!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2