黑马程序员技术交流社区
标题:
反射疑问
[打印本页]
作者:
位雪
时间:
2012-10-6 02:17
标题:
反射疑问
本帖最后由 位丹丹 于 2012-10-6 20:13 编辑
高新技术反射中代码:
package day01;
public class ReflectPoint {
private int x;
public int y;
public String str1 = "Hello,my dear friends";
public String str2 = "I don't think you can do that";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + "]";
}
}
复制代码
package day01;
import java.lang.reflect.Field;
public class Reflect {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3,5);//pt1到低表示哪个对象?
Field fieldY = pt1.getClass().getField("y");//此处pt1表示什么内容
System.out.println(fieldY.get(pt1));
changeStringValue(pt1);//此处pt1表示什么内容?
System.out.println(pt1);
}
private static void changeStringValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for(Field field:fields)
{
if(field.getType().equals(String.class))
{
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('n', 'w');
field.set(obj, newValue);
}
}
}
}
Field fieldY = pt1.getClass().getField("y");中的pt1与changeStringValue(pt1);中的pt1相同吗?很不理解,它们具体表示什么内容,望指点迷津
作者:
黄小贝
时间:
2012-10-6 02:32
ReflectPoint pt1 = new ReflectPoint(3,5); //这句话到底做了什么,一共 3 步 如下所示
(1)在栈中声明一个变量 pt1 这是一个ReflectPoint 类型的引用
(2)在堆中new 出一个ReflectPoint(3,5) 的对象
(3)让pt1 这个ReflectPoint 引用指向一个ReflectPoint 对象
so~pt1 是一个指向 ReflectPoint(3,5) 对象的引用 ,这个引用没有得到任何改变,所以两个地方的没有区别
作者:
佘天宇
时间:
2012-10-6 10:16
本帖最后由 佘天宇 于 2012-10-6 10:18 编辑
!!
作者:
佘天宇
时间:
2012-10-6 10:19
package cn.itcast.heima.technology;
import java.lang.reflect.Field;
class ReflectPoint {
private int x;
public int y;
public String str1 = "Hello,my dear friends";
public String str2 = "I don't think you can do that";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + "]";
}
}
public class ForReflect {
/**
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3,5);//pt1到低表示哪个对象?
//你上面不是定义了类ReflectPoint,并且提供了带参数的构造方法,
//这pt1不就是指向创建的对象new ReflectPoint(3,5)么
Field fieldY = pt1.getClass().getField("y");//此处pt1表示什么内容
//根据对象获得自己的Class对象,再根据Class对象获取指定名称的公公成员字段对象
System.out.println(fieldY.get(pt1));//获取字段在对象普通pt1中的值
changeStringValue(pt1);//此处pt1表示什么内容?
//调用下面你定义静态的功能函数,并将pt1作为参数传递过去,pt1指向对象new ReflectPoint(3,5),引用型变量啊
//输出对象,自动调用toString()方法
System.out.println(pt1);
}
private static void changeStringValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();//获取字段,明显字段可能不为一,所以返回的是数组
for(Field field:fields)//遍历数组
{
//获取字段的Class类对象,并判断是不是String.class类型的
if(field.getType().equals(String.class))
{
String oldValue = (String)field.get(obj);//获取字段在对象obj(就是传入的对象)中的值
String newValue = oldValue.replace('n', 'w');//将'n'替换成'w'
field.set(obj, newValue);//在指定的对象上设置字段的值。
}
}
}
/*Field fieldY = pt1.getClass().getField("y");中的pt1与changeStringValue(pt1);中的pt1相同吗?
* 很不理解,它们具体表示什么内容,望指点迷津
//很明显,是一样的,同样的都是对象new ReflectPoint(3,5)的引用型变量
*/
}
//还有问题可以加个好友,哈哈!
复制代码
作者:
佘天宇
时间:
2012-10-6 15:56
{:soso_e183:}
作者:
佘天宇
时间:
2012-10-6 20:01
无懈可击 ??{:soso_e127:}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2