黑马程序员技术交流社区

标题: 一点疑问 [打印本页]

作者: 彭润生    时间: 2012-9-7 10:18
标题: 一点疑问
本帖最后由 彭润生 于 2012-9-10 08:31 编辑

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class BeanDemo {

public static void main(String[] args)throws Exception {

  Constructor cs = Person.class.getConstructor( String.class,int.class);//为什么构造函数加个public就 可以了,不加就会抛异常呢?里面getConstructor(String.class,int.class)和getConstructor(new Class[]{string.class,int.class})的区别
  Person p = (Person)cs.newInstance(new String("lisi"),25);
  Method setMethod = Person.class.getMethod("setName", String.class);
  setMethod.invoke(p, new String("wangliu"));
  Field fieldAge = Person.class.getDeclaredField("age");
  fieldAge.setAccessible(true);
  fieldAge.set(p,30);
  System.out.println(fieldAge.get(p));
}
}
class Person{
private String name;
private int age;
public Person(String name,int age){
  this.name= name ;
  this.age = age;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
  System.out.println("setName run--");
}
public int getAge() {
  return age;
}
public void setAge(int age) {
  this.age = age;
}
}
为什么啊

作者: 武庆东    时间: 2012-9-7 10:18
本帖最后由 武庆东 于 2012-9-7 10:40 编辑

public class BeanDemo {

public static void main(String[] args)throws Exception {

  Constructor cs = Person.class.getConstructor( String.class,int.class);
/*为什么构造函数加个public就 可以了,不加就会抛异常呢?
解答:构造函数就是用于创建对象时使用,public是权限最大包,创建对象是调用该方法。如果不加public默认构造方法,只能在同一包内访问,如果在不同的包就不可以了!所以,加public限制修饰符,如果这两个类在同一包中就不必加public!
里面getConstructor(String.class,int.class)和getConstructor(new Class[]{string.class,int.class})的区别
解答:这里涉及到一个自动拆箱的功能,API解释
Constructor<Person> java.lang.Class.getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException参数:这里参数的含义,指调用相应构造函数需要的可变参数。参数可以以数组形式传递,运行时会自动进行拆分parameterTypes the parameter array
*/
  Person p = (Person)cs.newInstance(new String("lisi"),25);
  Method setMethod = Person.class.getMethod("setName", String.class);
  setMethod.invoke(p, new String("wangliu"));
  Field fieldAge = Person.class.getDeclaredField("age");
  fieldAge.setAccessible(true);
  fieldAge.set(p,30);
  System.out.println(fieldAge.get(p));
}
}
class Person{
private String name;
private int age;
public Person(String name,int age){
  this.name= name ;
  this.age = age;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
  System.out.println("setName run--");
}
public int getAge() {
  return age;
}
public void setAge(int age) {
  this.age = age;
}
}


作者: 李京    时间: 2012-9-7 10:34
本帖最后由 李京 于 2012-9-7 10:44 编辑

加public表示外部可以实例化该对象,
如果是private,则只能本类可见。

不加public 默认private, 如何你单独写类的话 可能理解会更容易一些
这里虽然写在一个文件里 但是不在一个类里

getConstructor(String.class,int.class)和getConstructor(new Class[]{string.class,int.class}) 写法不同 目的相同
作者: AngieFans85    时间: 2012-9-7 13:11
"为什么构造函数加个public就 可以了,不加就会抛异常呢?"

构造方法完全可以不加public,直接private都可以的.但是代码要稍微改一下:
  1. Constructor<?> cs = Person.class.getDeclaredConstructor(String.class,
  2.                                 int.class);
复制代码
改成这样就对了,注意是getDeclaredConstructor()方法哦.
明白了吗,这个方法是可以取得Person类的所有的构造方法,包括private修饰的构造方法.
而getConstructor()方法只能取得Person类的public修饰的构造方法哦.
简单点说,就是getConstructor()方法与getDeclaredConstructor()方法的区别,注意那"Declared"哦,这个是问题的关键.
不止构造方法是这样,包括普通方法(静态和非静态的方法都是由Method类来表示),字段(由Field来表示),还有参数,异常,我就不一一说下去了.我只想说,取得方法也好,字段也罢,一定要注意方法名中有没有"Declared"存在.
作者: AngieFans85    时间: 2012-9-7 13:15
李京 发表于 2012-9-7 10:34
加public表示外部可以实例化该对象,
如果是private,则只能本类可见。

"不加public 默认private"

不加public,默认是default哦.
问题根本不是出在访问权限上,详见"报纸"楼,希望对你有所帮助.




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