黑马程序员技术交流社区

标题: 反射的时候,内部类为什么不行? [打印本页]

作者: ysdolls    时间: 2014-8-12 10:35
标题: 反射的时候,内部类为什么不行?
反射的时候 Person.class.getConstructor(String.class).newInstance("haha");   
Person 为内部类的时候为什么报错?Exception in thread "main" java.lang.NoSuchMethodException:
而Person为外部类的时候就可以正常运行?
  1. package com.ys.d1;

  2. import java.lang.reflect.*;

  3. public class ReflectionDemo {

  4.         public static void reflection_1() throws Exception {
  5.                 Class cla = Person.class;
  6.                 // Constructor<person> con= cla.getConstructor(String.class);
  7.                 Constructor com = String.class.getConstructor(StringBuffer.class);
  8.                 String abc = (String) com.newInstance(new StringBuffer("haha"));
  9.                 System.out.println(abc);

  10.         }

  11.         public static void reflection_2() throws Exception {
  12.                 Constructor con = Person.class.getConstructor(String.class);
  13.                 Person person = (Person) con.newInstance("haha");
  14.                 System.out.println(person.getName());

  15.         }

  16.         public static void main(String[] args) throws Exception {
  17.                 reflection_2();
  18.         }

  19.         class Person {
  20.                 private String name = null;
  21.                 private int age = 0;

  22.                 public Person() {

  23.                 }

  24.                 public Person(String name) {
  25.                         this.name = name;

  26.                 }

  27.                 public Person(int age) {
  28.                         this.age = age;

  29.                 }

  30.                 public Person(String name, int age) {
  31.                         this.name = name;
  32.                         this.age = age;
  33.                 }

  34.                 public String getName() {
  35.                         return name;
  36.                 }

  37.                 public void setName(String name) {
  38.                         this.name = name;
  39.                 }

  40.                 public void setAge(int age) {
  41.                         this.age = age;
  42.                 }

  43.                 public int getAge() {
  44.                         return age;
  45.                 }

  46.         }

  47. }
复制代码





作者: fantacyleo    时间: 2014-8-12 11:02
非静态内部类的方法和构造函数的第一个参数是一个隐含的对外部类的引用,所以内部类构造函数的参数个数是两个,你得这么写:
  1. public static void reflection_2() throws Exception {
  2.                         Test t = new Test();
  3.                 Constructor con = Person.class.getConstructor(Test.class, String.class);
  4.                 Person person = (Person) con.newInstance(t, "haha");
  5.                 System.out.println(person.getName());

  6.         }
复制代码

作者: More    时间: 2014-8-12 11:11
会不会是因为Person是内部类  然后对于内部的创建对象的形式  为new ReflectionDemo().new Person()的形式,所以你在Person person = (Person) con.newInstance("haha");会出错    我也没做出来。。。
作者: ysdolls    时间: 2014-8-12 12:07
fantacyleo 发表于 2014-8-12 11:02
非静态内部类的方法和构造函数的第一个参数是一个隐含的对外部类的引用,所以内部类构造函数的参数个数是两 ...

谢谢了  再问一句 内部类用做反射 是不是没有意义? 反射不就是在类运行时 改变 原类的成员吗?如果之前已经写成内部类,那根本就不需要用反射吧。
作者: fantacyleo    时间: 2014-8-12 13:09
ysdolls 发表于 2014-8-12 12:07
谢谢了  再问一句 内部类用做反射 是不是没有意义? 反射不就是在类运行时 改变 原类的成员吗?如果之前 ...

不一定吧,看你的需求
作者: 周峰峰    时间: 2014-8-12 13:11
学习一下




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