java 反照和暴力反射 两个DEMO

java 反射和暴力反射 两个DEMO



该类为反射函数 获取和暴力获取ReflectPoin类中的属性

package com.tuozou.test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectTest {

	public ReflectTest() {
		// TODO Auto-generated constructor stub
	}
	//创建一个改变属性值的方法
	private static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException{
		//建立一个Field的数组对象存放获取对象的多个属性
		Field[] fields=obj.getClass().getFields();
		for(Field field:fields){//遍历对象
			//判断是否存在属性类型为字符串的类型
			if(field.getType() == String.class){
				//获取属性为String的对象 
				String oldValueString=(String)field.get(obj);
				//将新的字符串替换老的字符串
				String newValueString=oldValueString.replace("a", "b");
				//对配置的对象设值新值
				field.set(obj, newValueString);
			}
		}
	}

	public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
		// TODO Auto-generated method stub
		//System.out.println(pt1);
		//对ReflectPoint类的属性进行反射
		ReflectPoint pt1=new ReflectPoint(3,5);
		//得到一个字段
		Field fieldY=pt1.getClass().getField("y");
		//取出在某个对象属性上的值
		System.out.println(fieldY.get(pt1));
		//同理取出其他对象上的值
		Field fieldX=pt1.getClass().getDeclaredField("x");//取出私有的时候是看不到的会报错
		//对于被设置为私有的属性 我们进行强制(暴力)反射 就是对要获取的属性进行setAccessible()
		fieldX.setAccessible(true);
		System.out.println(fieldX.get(pt1));
		
		changeStringValue(pt1);
		System.out.println(pt1);
		
		String str1="abc";
		//用反射得到类中的某一个方法 用Method类来完成 用str1对象身上的charAt(1) str1.charAt(1)
		Method methodChartAt=String.class.getMethod("charAt", int.class);
		System.out.println(methodChartAt.invoke(pt1.str2, 1));//这里是取出反射文件中的str2字符串的第二个单词
		System.out.println(str1.charAt(1));//当前对象中的第二个单词
	}

}


该类为被反射的类

package com.tuozou.test;

public class ReflectPoint {

	private int x;
	public int y;
	public String str1="able";
	public String str2="apple";
	public String str3="great";
	public ReflectPoint(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	public ReflectPoint() {
		// TODO Auto-generated constructor stub
	}
	//为了能看到映射替换的效果 还有必要覆盖toString的方法
	@Override
	public String toString(){
		return str1+":"+str2+":"+str3;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}