首页 > 代码库 > 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 } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。