`
hubin4
  • 浏览: 92817 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

for java beginner10 java 反射 Field类

    博客分类:
  • JAVA
阅读更多
java 反射 Field类

-------用到一个bean
package com.ncs;

public class Point {

	private int x;
	public int y;
	
	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	
}

--------------------
package com.ncs;

import java.lang.reflect.Field;

//need another bean Point
public class ReflectTest {
	//★这里说的Field都是 类 身上的,不是实例上的
	public static void main(String[] args) throws Exception {
		
		Point pt1 = new Point(3,5);
		
		//得到一个字段
		Field fieldY = pt1.getClass().getField("y"); //y 是变量名
		//fieldY的值是5么?? 大错特错
		//fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊
		//不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值
		//要这样
		System.out.println(fieldY.get(pt1)); //这才是5
		
		//现在要x了
		
		/* 
		Field fieldX = pt1.getClass().getField("x"); //x 是变量名
		System.out.println(fieldX.get(pt1)); 
		*/
		
		//运行 报错 私有的,找不到
		//NoSuchFieldException
		//说明getField 只可以得到 公有的
		//怎么得到私有的呢??
		
		/*
		Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
		//然后轮到这里错了
		// java.lang.IllegalAccessException:
		//Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private"
		System.out.println(fieldX.get(pt1));
		*/
		
		//三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用  三是暴力抢了
		
		//暴力反射  
		Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
		fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了
		System.out.println(fieldX.get(pt1)); 
		
		//out 3 OK!!
		
		
	}
}

---------------------------下面做的小实验,把一个类里所有String类型的字段里的值 b 变 a

package com.ncs;

public class Point {

	private int x;
	public int y;
	
	public  String s1 ="ball";
	public String s2="hubin";
	public String s3="zhangxiaoxiang";
	//做实验而已,字段不可能是 public 的
	
	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	
}

----------------------------
package com.ncs;

import java.lang.reflect.Field;

//need another bean Point
public class ReflectTest {
	
	public static void main(String[] args) throws Exception {
		
		Point pt1 = new Point(3,5);
		
		//get all fields
		Field[] fields = pt1.getClass().getFields(); 
		
		for(Field field : fields ) {
			//我说的是String 类型的字段,当然要选择一下
			//if(field.getType().equals(String.class)) {
			//字节码都是一份的,干什么用equals啊
			if(field.getType()== String.class) {
				String oldValue = (String)field.get(pt1);
				String newValue = oldValue.replace('b', 'a');
				//改 对象的字段
				field.set(pt1, newValue);
				
			}
		}
		
		System.out.println(pt1.s1);
		System.out.println(pt1.s2);
		System.out.println(pt1.s3);
		
		//aall
		//huain
		//zhangxiaoxiang

	}
}

---------------------------------
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics