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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© student 中级黑马   /  2013-6-2 19:09  /  1290 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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. }
复制代码


评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

3 个回复

倒序浏览
  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对象,欺骗编译器。
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
在反射中,如果参数是基础类型,如果在反射方法中想使用基础类型的包装类,不是用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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
刘海芳 发表于 2013-6-3 09:24
在反射中,如果参数是基础类型,如果在反射方法中想使用基础类型的包装类,不是用class关键字,而是用TYPE ...

嗯嗯,原来如此!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马