黑马程序员技术交流社区
标题:
一点疑问
[打印本页]
作者:
彭润生
时间:
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都可以的.但是代码要稍微改一下:
Constructor<?> cs = Person.class.getDeclaredConstructor(String.class,
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