通过反射获取属性修改值

package com.bootdo.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

public class CheckDemo {
	/*通过反射获取对象的属性并赋值*/
	
	/*	工具类,将传入的对象的数据进行安全处理*/
	
	public static void checkDemo(Object bean){
		Class<?> cls = bean.getClass();  
        Map<String, String> valueMap = new HashMap<String, String>();  
        // 取出bean里的所有方法  
        Method[] methods = cls.getDeclaredMethods();  
        Field[] fields = cls.getDeclaredFields();
        
        
        for (Field field : fields) {  
            try {
            	
            	//获取值  
            	String fieldType = field.getType().getSimpleName();  
                String fieldGetName = parGetName(field.getName());  
                if (!checkGetMet(methods, fieldGetName)) {  
                    continue;  
                }
                String fieldSetName = parSetName(field.getName());  
                
             
                
                if (!checkSetMet(methods, fieldSetName)) {  
                    continue;  
                } 
                                                
                Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {}); 
                Method fieldSetMet = cls.getMethod(fieldSetName, field.getType());
                
                Object fieldVal = fieldGetMet.invoke(bean, new Object[] {});                    
                
                if (null != fieldVal && !"".equals(fieldVal)){
                	//判断类型  这里值处理spring类型的吧
                	if ("String".equals(fieldType)) {
                		
                		String str=(String) fieldVal;
                		//将编码走自已转码
                		str=CheckChar.b_trans_q(str);  //处理string的一个方法,有兴趣的可以看一下
                		fieldSetMet.invoke(bean, str);
                		
                	}
                	
                } 	
            } catch (Exception e) {  
                continue;  
            }
        }
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/* 首先写获取属性的方法*/
	 public static Map<String, String> getFieldValueMap(Object bean) {  
	        Class<?> cls = bean.getClass();  
	        Map<String, String> valueMap = new HashMap<String, String>();  
	        // 取出bean里的所有方法  
	        Method[] methods = cls.getDeclaredMethods();  
	        Field[] fields = cls.getDeclaredFields();  
	  
	        for (Field field : fields) {  
	            try {  
	                String fieldType = field.getType().getSimpleName();  
	                String fieldGetName = parGetName(field.getName());  
	                if (!checkGetMet(methods, fieldGetName)) {  
	                    continue;  
	                }  
	                Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {});  
	                Object fieldVal = fieldGetMet.invoke(bean, new Object[] {});  
	                String result = null;  
	                if ("Date".equals(fieldType)) {  
	                    result = fmtDate((Date) fieldVal);  
	                } else {  
	                    if (null != fieldVal) {  
	                        result = String.valueOf(fieldVal);  
	                    }  
	                }  
	                valueMap.put(field.getName(), result);  
	            } catch (Exception e) {  
	                continue;  
	            }  
	        }  
	        return valueMap;  
	  
	    }  
	  
	
	
	/*注入属性
*/	
    public static void setFieldValue(Object bean, Map<String, String> valMap) {  
        Class<?> cls = bean.getClass();  
        // 取出bean里的所有方法  
        Method[] methods = cls.getDeclaredMethods();  
        Field[] fields = cls.getDeclaredFields();  
  
        for (Field field : fields) {  
            try {  
                String fieldSetName = parSetName(field.getName());  
                if (!checkSetMet(methods, fieldSetName)) {  
                    continue;  
                }  
                Method fieldSetMet = cls.getMethod(fieldSetName, field.getType());  
                String value = valMap.get(field.getName());  
                if (null != value && !"".equals(value)) {  
                    String fieldType = field.getType().getSimpleName();  
                    if ("String".equals(fieldType)) {  
                        fieldSetMet.invoke(bean, value);  
                    } else if ("Date".equals(fieldType)) {  
                        Date temp = parseDate(value);  
                        fieldSetMet.invoke(bean, temp);  
                    } else if ("Integer".equals(fieldType) || "int".equals(fieldType)) {  
                        Integer intval = Integer.parseInt(value);  
                        fieldSetMet.invoke(bean, intval);  
                    } else if ("Long".equalsIgnoreCase(fieldType)) {  
                        Long temp = Long.parseLong(value);  
                        fieldSetMet.invoke(bean, temp);  
                    } else if ("Double".equalsIgnoreCase(fieldType)) {  
                        Double temp = Double.parseDouble(value);  
                        fieldSetMet.invoke(bean, temp);  
                    } else if ("Boolean".equalsIgnoreCase(fieldType)) {  
                        Boolean temp = Boolean.parseBoolean(value);  
                        fieldSetMet.invoke(bean, temp);  
                    } else {  
                        System.out.println("not supper type" + fieldType);  
                    }  
                }  
            } catch (Exception e) {  
                continue;  
            }  
        }  
  
    }  
	
	
	
	
	
	 /*
     * 格式化string为Date 
     */  
    private static Date parseDate(String datestr) {  
        if (null == datestr || "".equals(datestr)) {  
            return null;  
        }  
        try {  
            String fmtstr = null;  
            if (datestr.indexOf(':') > 0) {  
                fmtstr = "yyyy-MM-dd HH:mm:ss";  
            } else {  
                fmtstr = "yyyy-MM-dd";  
            }  
            SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK);  
            return sdf.parse(datestr);  
        } catch (Exception e) {  
            return null;  
        }  
    }  
    /*
     * 日期转化为String 
     *
     */  
    private static String fmtDate(Date date) {  
        if (null == date) {  
            return null;  
        }  
        try {  
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);  
            return sdf.format(date);  
        } catch (Exception e) {  
            return null;  
        }  
    }  
  
    /* 
     * 判断是否存在某属性的 set方法 
     * 
     */  
    private static boolean checkSetMet(Method[] methods, String fieldSetMet) {  
        for (Method met : methods) {  
            if (fieldSetMet.equals(met.getName())) {  
                return true;  
            }  
        }  
        return false;  
    }  
    /*
     * 判断是否存在某属性的 get方法 
     * 
     */  
    private static boolean checkGetMet(Method[] methods, String fieldGetMet) {  
        for (Method met : methods) {  
            if (fieldGetMet.equals(met.getName())) {  
                return true;  
            }  
        }  
        return false;  
    }  
  
    /*
     * 拼接某属性的 get方法 
     * 
     */  
    private static String parGetName(String fieldName) {  
        if (null == fieldName || "".equals(fieldName)) {  
            return null;  
        }  
        return "get" + fieldName.substring(0, 1).toUpperCase()  
                + fieldName.substring(1);  
    }  
    /*
     * 拼接在某属性的 set方法 
     *
     */  
    private static String parSetName(String fieldName) {  
        if (null == fieldName || "".equals(fieldName)) {  
            return null;  
        }  
        return "set" + fieldName.substring(0, 1).toUpperCase()  
                + fieldName.substring(1);  
    } 
	
	

	
	
	
}

有兴趣的可以看上string中的脚本注入处理
处理字符串中注入脚本的方法:

//半角转全角
		public static String b_trans_q(String b){
			 char[] c =b.toCharArray();
			StringBuffer sb = new StringBuffer();
			
			for(int i=0;i<c.length;i++){
				switch(c[i]){
				case '>':
					sb.append(">");
					break;
				case '<':
					sb.append("<");
					break;
				case '\'':
					sb.append("'");
					break;
				case '\"':
					sb.append(""");
					break;
				case '&':
					sb.append("&");
					break;
				case '#':
					sb.append("#");
					break;
				case '\\':
					sb.append("\");
					break;
				case '%':
					processUrlEncode(sb,b,i);
					break;
				
				default:
					sb.append(c[i]);
					break;
				}
		
			}
			
			
			return sb.toString();
		}
		
		
		//解决encoder问题
		
		public  static void  processUrlEncode(StringBuffer sb,String b,int i){
			char[] c =b.toCharArray();
			
			if(b.length()>i+2){
				//%3c
				if(c[i+1]=='3' &&(c[i+2]=='c'||c[i+2]=='C')){
					sb.append('<');
					return;
				}
				//%3c (0x3c=60)
				if(c[i+1]=='6' &&c[i+2]=='0'){
					sb.append('<');
					return;
				}
				//%3e
				if(c[i+1]=='3' &&(c[i+2]=='e'||c[i+2]=='E')){
					sb.append('>');
					return;
				}
				//&3e (0x3e=62)
				if(c[i+1]=='6' &&c[i+2]=='2'){
					sb.append('>');
					return;
				}
		
			}
			sb.append(c[i]);
			
		}

完毕

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java反射是指在程序运行的时候,通过特定的API来检查或修改程序的状态、能力和内部属性等,而这些在正常情况下是无法通过编译时检查来完成的。例如,通过反射机制,我们可以获取一个对象的类型信息并调用其方法、访问它的属性,以及创建一个新对象等。 反射获取对象属性,首先需要通过Class类的forName()方法来获取对象的Class实例。然后通过Class类的getDeclaredField()方法获取对象属性的Field对象,再通过Field对象的get()方法来获取属性。如果需要获取私有属性,则需要通过setAccessible(true)方法来取消Java语言的访问检查机制,以允许获取私有属性。 例如,假设有一个Person类,其中包含有一个private String name属性,现在需要获取属性,可以使用反射机制进行如下操作: ``` Class<?> clazz = Person.class; Object obj = clazz.newInstance(); Field field = clazz.getDeclaredField("name"); field.setAccessible(true); String nameValue = (String) field.get(obj); ``` 通过以上代码,我们可以获取Person对象的name属性,并将其赋给nameValue变量中。 需要注意的是,反射机制虽然功能强大,但由于它会在运行时改变程序的状态和能力,因此会带来诸多安全性和性能上的问题,尤其是容易引起类型转换异常和内存泄漏等问题,因此在使用反射机制时要谨慎操作,避免不必要的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值