黑马程序员技术交流社区
标题:
反射问题
[打印本页]
作者:
NewDemo
时间:
2014-5-9 13:40
标题:
反射问题
本帖最后由 NewDemo 于 2014-5-9 20:31 编辑
代码如下:会报错,求解是什么原因,如何解决
package com.itheima;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
public class Test5 {
/**
* @param args
* 5、 定义一个标准的JavaBean,名叫Person,包含属性name、age。使用反射的方式创建一个实例、
* 调用构造函数初始化name
* 、age,使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
*/
public static void main(String[] args) throws Exception{
method_0();
}
/**
* 定义方法,使用反射的方式创建一个实例、调用构造函数初始化name、age,
* 使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
*/
public static void method_0() throws Exception{
// 反射创建Person的实例
Person p1 = (Person)Person.class
.getConstructor(String.class, int.class)
.newInstance("Jack", 20);
// 使用反射方式调用setName方法对名称进行设置
String propertyNameX = "x";
PropertyDescriptor pd = new PropertyDescriptor(propertyNameX,
p1.getClass());
pd.getWriteMethod().invoke(p1, "Tracy");
System.out.println(p1);
//不使用setAge方法直接使用反射方式对age赋值
Field fieldAge = p1.getClass().getDeclaredField("age");
fieldAge.setAccessible(true);
System.out.println(fieldAge.get(p1));
}
}
// 创建Person类
class Person {
private String name;
private int age;
Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return name + "::" + age;
}
}
复制代码
作者:
曹冬明
时间:
2014-5-9 15:35
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
public class Test5 {
/**
* @param args
* 5、 定义一个标准的JavaBean,名叫Person,包含属性name、age。使用反射的方式创建一个实例、
* 调用构造函数初始化name
* 、age,使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
*/
public static void main(String[] args) throws Exception{
method_0();
}
/**
* 定义方法,使用反射的方式创建一个实例、调用构造函数初始化name、age,
* 使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
*/
public static void method_0() throws Exception{
// 反射创建Person的实例
Person p1 = (Person)Person.class
.getConstructor(String.class, int.class)
.newInstance("Jack", 20);
// 使用反射方式调用setName方法对名称进行设置
String propertyNameX = "name";
PropertyDescriptor pd = new PropertyDescriptor(propertyNameX,
p1.getClass());
pd.getWriteMethod().invoke(p1, "Tracy");
System.out.println(p1);
//不使用setAge方法直接使用反射方式对age赋值
Field fieldAge = p1.getClass().getDeclaredField("age");
fieldAge.setAccessible(true);
fieldAge.set(p1,25);
System.out.println(fieldAge.get(p1));
}
}
// 创建Person类
class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return name + "::" + age;
}
}
复制代码
帮你改过了!第一个问题是反射只能操作public修饰的成员,所以,你的Person的构造函数加上public就行了
第二个问题是,题目好像是对age赋值啊,我帮你加了一句代码
作者:
NewDemo
时间:
2014-5-9 16:02
原来是这样,学习了,:lol感谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2