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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 彭润生 中级黑马   /  2012-9-7 10:18  /  1652 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 彭润生 于 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;
}
}
为什么啊

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
本帖最后由 武庆东 于 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;
}
}

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 李京 于 2012-9-7 10:44 编辑

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

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

getConstructor(String.class,int.class)和getConstructor(new Class[]{string.class,int.class}) 写法不同 目的相同
回复 使用道具 举报
"为什么构造函数加个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"存在.
回复 使用道具 举报
李京 发表于 2012-9-7 10:34
加public表示外部可以实例化该对象,
如果是private,则只能本类可见。

"不加public 默认private"

不加public,默认是default哦.
问题根本不是出在访问权限上,详见"报纸"楼,希望对你有所帮助.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马