黑马程序员技术交流社区
标题:
反射构造方法出现异常
[打印本页]
作者:
李挺
时间:
2013-2-22 12:41
标题:
反射构造方法出现异常
本帖最后由 李挺 于 2013-2-27 16:45 编辑
package day27;
import java.lang.reflect.Constructor;
public class Test2 {
/**
* @param args
* @throws Exception
* @throws InstantiationException
*/
public static void main(String[] args) throws InstantiationException, Exception {
// TODO Auto-generated method stub
Constructor<Person> constructor=Person.class.getConstructor(String.class,int.class);
Person p=constructor.newInstance("zhangsan",24);
System.out.println(p);
}
}
class Person{
private String name;
private int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString(){
return name+"==="+age;
}
}
复制代码
一运行就抛异常
是不是 int.class没有这个字节码啊?写Integer.class也不行
作者:
张豪杰
时间:
2013-2-22 14:19
你Person类中的构造函数,要声明为public才行
因为getConstructor(Class[] params) 和getConstructors()仅仅可以获取到public的构造函数。
或者你在获取构造函数的时候选用getDeclaredConstructors(),这个方法则可以获取到所有的构造函数。
但是调用这个方法的话,要注意安全检查,如果获取的构造函数是public或者是默认权限(即friendly),则不用setAccessible(true)也能正常运行
如果获取的构造函数是private的话,就会抛出java.lang.IllegalAccessException
看看下面的简化代码
package cn.itcast;
import java.lang.reflect.Constructor;
class Constructortest {
public static void main(String[] args) throws InstantiationException, Exception {
// TODO Auto-generated method stub
Constructor<Person> constructor=Person.class.getDeclaredConstructor(String.class,int.class);
constructor.setAccessible(true);//private权限的构造函数需要安全检查
Person p=constructor.newInstance("zhangsan",24);
System.out.println(p);
}
}
class Person{
private String name;
private int age;
private Person(String name,int age){ //这里构造函数声明为private
this.name=name;
this.age=age;
}
@Override
public String toString(){
return name+"==="+age;
}
}
复制代码
作者:
顾传文
时间:
2013-2-22 14:53
你调用的是getConstructor方法,API中说得很清楚。该方法返回与指定的 parameterTypes 相匹配的公共构造方法的 Constructor 对象。
解决办法:
第一种方法:将你的构造方法修饰为public类型的。
第二种方法:将getConstructor方法改为getDeclaredConstructor。
补充:
如果你的构造方法修饰为private类型的,获取构造方法必须用getDeclaredConstructor方法。而且你必须调用setAccessible方法,将反射出来的构造方法设置为允许访问,否则就会出现“IllegalAccessException”。
Filed的反射和Method的反射与此类似。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2