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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王红潮 中级黑马   /  2012-9-14 12:47  /  1423 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Outer {
  2. public static void main(String[] args) throws InstantiationException, IllegalAccessException {
  3. new Outer().test();
  4. }

  5. private void test() throws InstantiationException, IllegalAccessException {

  6. System.out.println(new Inner()); //正常运行
  7. //System.out.println(Outer.Inner.class.newInstance());
  8. System.out.println(Inner.class.newInstance());

  9. }

  10. public class Inner{
  11. public String toString(){
  12. return "Inner case";
  13. }
  14. }
  15. }
复制代码
利用反射调用Inner构造器创建对象,运行异常:Outer$Inner,但前面加了外部类限定Outer.Inner.class.newInstance();依然是运行异常,这里应该怎样才能访问?

评分

参与人数 1黑马币 +30 收起 理由
王德升 + 30 赞一个!

查看全部评分

4 个回复

倒序浏览
  1. System.out.println(new Inner()); // 正常运行
  2.        
  3.                  System.out.println(Inner.class);
  4.               //查看class是否有构造函数
  5.               System.out.println(Inner.class.getConstructors().length);
  6.               //获取第一个构造函数
  7.               System.out.println(Inner.class.getConstructors()[0]);
  8.               //用构造函数初始化内部类
  9.               System.out.println(Inner.class.getConstructors()[0].newInstance(new Outer()));
复制代码
回复 使用道具 举报
我这个是用边界法 还有一种就不说了
回复 使用道具 举报
在给你一个用反射实例化静态内部类的方法
  1.   System.out.println(Inner.class);
  2.       //查看class是否有构造函数
  3.       System.out.println(Inner.class.getDeclaredConstructors().length);
  4.       //获取第一个构造函数
  5.       Constructor c = Inner.class.getDeclaredConstructors()[0];
  6.       //将c设置成可访问      
  7.       c.setAccessible(true);
  8.       //用构造函数初始化内部类
  9.       System.out.println(c.newInstance(new Outer()));
复制代码
抛异常自己解决
回复 使用道具 举报
楼上的方法是对的,但要是这样解释我估计楼主也看不懂。

首先通过反射创建对象一般有两种方式,第一种就是楼主所用到的Inner.class.newInstance(),但是这种方式必须要求Inner这个类中有一个无参的构造函数。

第二种,就是通过构造方法了,但是怎样得到这个方法呢?如果用Inner.class.getConstructor()也只能得到一个无参的构造函数,楼主可以试一下,运行结果是java.lang.NoSuchMethodException这个异常,说明没找到这个方法。说明这个类没有无参构造函数。第一种方法肯定也是这个结果。

那么只能通过Inner.class.getConstructors()得到所有构造方法了,然后通过.length这个属性检查到只有一个构造方法,那么我们就可以通过Inner.class.getConstructors()[0]可以得到这个构造方法public com.Test.Outer$Inner(com.Test.Outer),可以看出这个方法有一个Outer的参数。再通过这个构造方法就能得到Inner这个类的对象了

要强调的是内部类的字节码很特别,比如说Inner这个类的字节码是Outer$Inner
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马