黑马程序员技术交流社区
标题:
为什么这种构造不报错呢。。用反射就会出问题。。是不...
[打印本页]
作者:
李金中
时间:
2014-2-12 13:32
标题:
为什么这种构造不报错呢。。用反射就会出问题。。是不...
本帖最后由 李金中 于 2014-2-12 13:33 编辑
package com.itheima;
import java.lang.reflect.Constructor;
public class reflex {
public static void main(String[] args)throws Exception
{
Person p1 = new Person("First");//注意 这样可以new
Constructor cons = Class.forName("com.itheima.Person").getDeclaredConstructor(String.class);//用反射居然就变成类似private的,必须加Declared
cons.setAccessible(true);
Person p3 = (Person)cons.newInstance("Third");
System.out.println(p1 + "+" + p3);
}
}
class Person
{
Person(String str)//注意 这没有修饰符
{
pStr = str;
}
public String getName()
{
return pStr;
}
public void setName(String str)
{
pStr = str;
}
public String toString()
{
return pStr;
}
private String pStr;
}
查了下 发现 如果一个包内定义的类包括其成员,如果不加修饰符,那么就类似于C++中的friend,可以互相访问。所以 Person p1 = new Person(“first”);
是OK的。
问题是 反射的话 就不认了么?
作者:
↑↓ME→←
时间:
2014-2-12 14:33
我也查了些网上的,说构造方法如果没有写访问修饰符,默认的就是friend,但是java中没有friend访问修饰符,可以理解为default,包级访问权限,即同一个包中的可以访问,而反射Person.class.getConstructor(String.class)是构造方法是public的,用Class.forName("com.itheima.Person").getDeclaredConstructor(String.class)可以忽略访问修饰符,设置可见,就可以直接访问!
作者:
↑↓ME→←
时间:
2014-2-12 14:35
import java.lang.reflect.Constructor;
public class reflex {
public static void main(String[] args)throws Exception
{
Person p1 = new Person("First");//注意 这样可以new
Constructor cons = Person.class.getConstructor(String.class);//用反射居然就变成类似private的,必须加Declared
Person p3 = (Person)cons.newInstance("Third");
System.out.println(p1 + "+" + p3);
}
}
class Person
{
private String pStr;
public Person(String str)
{
pStr = str;
}
public String getName()
{
return pStr;
}
public void setName(String str)
{
pStr = str;
}
public String toString()
{
return pStr;
}
}
复制代码
QQ截图20140212143442.png
(51.2 KB, 下载次数: 12)
下载附件
2014-2-12 14:35 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2