黑马程序员技术交流社区
标题:
关于反射的疑问
[打印本页]
作者:
杨鹏鹏
时间:
2012-8-24 13:57
标题:
关于反射的疑问
本帖最后由 杨鹏鹏 于 2012-8-24 13:58 编辑
public static void main(String[] args) throws SecurityException, Exception {
// TODO Auto-generated method stub
/* --------------------------- 构造函数 ---------------------------- */
Person p=new Person(); //①这儿用Class.forName("com.itheima.threed1.Reflection")错
Constructor con= p.getClass().getConstructor(int.class,String.class);//有参构造函数
con.setAccessible(true);
Person p1=(Person)con.newInstance(3,"周星驰");
System.out.println(p1.toString());
//System.out.println(p1.name+p1.age);//②出错,The field Person.age is not visible
System.out.println( Person.class.newInstance().toString());//无参构造函数
Constructor[] cons=Person.class.getConstructors();
System.out.println("个数为"+cons.length);
for(Constructor c:cons){
//③怎么判断是否为有参构造函数
//System.out.println(c.newInstance(10,"爱我中华").toString());//出错。
//System.out.println(c.newInstance().toString());//错
}
/* -------- 获取方法 ------------- */
//私有的静态方法
Method m3=Person.class.getDeclaredMethod("getS", String.class);
m3.setAccessible(true);//私有方法
System.out.println( m3.invoke(null, "你好,我也好"));//④你好,我也好 null(这个null怎么来滴)
}
}
class Person
{
public Person() {
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
private int age=10;
public String name="张三";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void getArrays(int[] i){
for(Integer a:i){
System.out.println(a);
}
}
@Override
public String toString(){
return name+"哈哈,找到我了"+age;
}
private static void getS(String a){
System.out.println(a);
}
}
①处用Class.forName("com.itheima.threed1.Reflection") 读不到数据?
② 处 无法读取private 变量 尽管 con.setAccessible(true);?
③怎么判断是否为有参构造函数 ?
④你好,我也好 null(这个null怎么来滴) ?
作者:
杜鹏云
时间:
2012-8-24 15:46
本帖最后由 杜鹏云 于 2012-8-24 15:51 编辑
Person p=new Person();
//①这儿用Class.forName("com.itheima.threed1.Reflection")错,不知道你要反射哪个类??Person还是Refection
Constructor con= p.getClass().getConstructor(int.class,String.class);//有参构造函数
con.setAccessible(true);//这句代码没多大意义..因为你的构造函数都是公有的
Person p1=(Person)con.newInstance(3,"周星驰");
System.out.println(p1.toString());
//System.out.println(p1.name+p1.age);//②你的age是私有变量,类外访问不到的
你构造函数的
con.setAccessible(true)并不能代表字段的Accessible,所以你必须设置字段对象的可访问行性
System.out.println( Person.class.newInstance().toString());//无参构造函数
Constructor[] cons=Person.class.getConstructors();
System.out.println("个数为"+cons.length);
for(Constructor c:cons){
//③怎么判断是否为有参构造函数
//System.out.println(c.newInstance(10,"爱我中华").toString());//出错。
//System.out.println(c.newInstance().toString());//错
/*
* 下面有如何判断是否为有参构造函数
*/
Class<?>[] cs=c.getParameterTypes();
if(Arrays.asList(cs).size()!=0)
{/*
Arrays.asList(cs)将一个Class数组转换为一个List,打印输出参数类型!
*/
System.out.println("该构造函数参数类型为:"+Arrays.asList(cs));
}
else
{
System.out.println("该构造函数无参构造函数");
}
//
}
/* -------- 获取方法 ------------- */
//私有的静态方法
Method m3=Person.class.getDeclaredMethod("getS", String.class);
m3.setAccessible(true);//私有方法
System.out.println(m3.invoke(null,"你好,我也好"));//④你好,我也好 null(这个null怎么来滴)
//JDK对于invoke有这样的解释
/*
* 如果方法正常完成,则将该方法返回的值返回给调用者;
* 如果该值为基本类型,则首先适当地将其包装在对象中。
* 但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;
* 换句话说,将返回基本类型的数组。
* 如果底层方法返回类型为 void,则该调用返回 null,所以如果你不打印m3.invoke(null,"你好,我也好")
* 结果自然就没有null.
*/
作者:
杨鹏鹏
时间:
2012-8-24 16:22
嗯,多谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2