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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 伪猫君 中级黑马   /  2014-10-22 16:51  /  3711 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
本帖最后由 伪猫君 于 2014-10-22 16:58 编辑

复制代码


package reflect;

import java.lang.reflect.Constructor;

class Person {
        String name;
        Person(String name) {
                this.name = name;
        }
}
public class Reflect {
        public static void main(String[] args) throws ClassNotFoundException, Exception, Exception {
                Class clazz = Class.forName("reflect.Person");
                Constructor constructor = clazz.getConstructor(String.class);
        }
}


Exception in thread "main" java.lang.NoSuchMethodException: reflect.Person.<init>(java.lang.String)
        at java.lang.Class.getConstructor0(Class.java:3069)
        at java.lang.Class.getConstructor(Class.java:1812)
        at reflect.Reflect.main(Reflect.java:14)


最佳答案

查看完整内容

getConstructor 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。这是Javaapi你写的,把构造方法设为public就可以了

11 个回复

倒序浏览
getConstructor 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。这是Javaapi你写的,把构造方法设为public就可以了
回复 使用道具 举报
  1. package reflect;
  2. import java.lang.reflect.Constructor;

  3. class Person {
  4.         String name;
  5.         public Person(String name) {
  6.                 this.name = name;
  7.         }
  8. }
  9. public class Reflect {
  10.         public static void main(String[] args) throws ClassNotFoundException, Exception, Exception {
  11.                 Class clazz = Class.forName("reflect.Person");
  12.                 Constructor constructor = clazz.getConstructor(String.class);
  13.                 System.out.println(constructor.getName());
  14.         }
  15. }
复制代码
回复 使用道具 举报

能说说为什么不取构造函数直接使用class.newInstructor()可以取得protect空参数构造函数?
回复 使用道具 举报
getConstructor改成getDeclaredConstructor 因为你的构造函数有访问限制所以只能暴力反射
回复 使用道具 举报
伪猫君 发表于 2014-10-23 06:37
能说说为什么不取构造函数直接使用class.newInstructor()可以取得protect空参数构造函数? ...

是clazz.newInstance();
这是Class类中定义的方法,用的应该就是暴力反射;
回复 使用道具 举报
Constructor constructor = clazz.getConstructor();
回复 使用道具 举报
郑飞 发表于 2014-10-23 10:37
是clazz.newInstance();
这是Class类中定义的方法,用的应该就是暴力反射;

但是当空参数构造函数定义为私有时clazz.newINstance() 报错
回复 使用道具 举报
郑飞 高级黑马 2014-10-24 07:48:51
9#
伪猫君 发表于 2014-10-24 07:21
但是当空参数构造函数定义为私有时clazz.newINstance() 报错

我一直想当然以为是暴力反射,看到你说的,我看了下API;
IllegalAccessException - 如果该类或其 null 构造方法是不可访问的。
如果是private 就访问不到 抛异常,protected在同一个包或子类中可以访问所以就没问题;
回复 使用道具 举报
郑飞 高级黑马 2014-10-24 08:07:35
10#
而普通反射只能反射出public修饰的内容
这么看来newInstance只要能访问就能反射 而普通get反射只能反射public修饰的内容
回复 使用道具 举报
void 中级黑马 2014-10-24 08:46:08
11#
伪猫君 发表于 2014-10-23 06:37
能说说为什么不取构造函数直接使用class.newInstructor()可以取得protect空参数构造函数? ...

http://blog.csdn.net/hongyuan19/article/details/1946636
Java中protected语义解释
回复 使用道具 举报
建议楼主用getDeclaredConstructor(参数的数据类型.class)方法获得构造函数对象,因为此方法得到的是与参数的数据类型及个数相对应的构造函数对象(那么此方法和getConstructor(参数的数据类型.class)的不同是,getConstructor返回的是访问权限为public的构造函数所对应的构造函数对象,而getDeclaredConstructor返回的是访问权限包含public在内的所有访问权限的构造函数所对应的构造函数对象):)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马