利用反射机制创建工具类对数据进行加密和解密

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23888451/article/details/84660197

对数据库的数据进行加密,包括用户数据、项目数据、聊天数据等,需要在插入表的的时候进行加密,查询的时候进行解密。利用java的反射机制,创建以下工具类,对数据进行加解密。

public class CryptoUtil {
	/**
	 * 加密、解密方法
	 * @param obj要加密或解密的对象
	 * @param type 1加密操作,2解密操作
	 * @throws Exception
	 */
	public static void cryptoObject(Object obj,Integer type) throws Exception{
		Class cls = obj.getClass();
		//思路:获取object的属性名称-->获取object的属性值-->对值进行加密/解密-->将加密后的值set回属性中
		Field[] fields = cls.getDeclaredFields();
		if(fields!=null&&fields.length>0){
			for(Field field : fields){
				field.setAccessible(true);//设置这些属性是可访问的
				Type fieldType = field.getGenericType();//返回属性声的Type类型
//				Class fieldType = field.getType();//获取属性声明时类型对象(返回class对象)
				if(fieldType.toString().equals("class java.lang.String")){//只对String类型的数据加密
					String fieldName = field.getName();
					String fieldValue = (String)field.get(obj);//获取属性的值
					if(fieldValue!=null&&!"".equals(fieldValue)){
						String encValue = null;
						switch (type) {
						case 1:
							encValue = AESUtil.encrypt(fieldValue);//进行加密
							break;
						case 2:
							encValue = AESUtil.decrypt(fieldValue);//进行加密
							break;
						}
						field.set(obj, encValue);//设置属性的值
					}
				}
			}
		}
	}
}

加密和解密的方法AESUtil.encrypt()、AESUtil.decrypt()参考:https://blog.csdn.net/qq_23888451/article/details/84658360

遇到的问题:
1.java.lang.IllegalAccessException: Class com.zz.util.CryptoUtil can not access a member of class com.zz.manage.model.Message with modifiers “private”。
Message类的属性设置为private,如果不设置field.setAccessible(true),将会报这个错误。
2.field.getGenericType()和field.getType()的区别

  • 返回的类型不一样,一个是Class对象一个是Type接口
  • 如果属性是一个泛型,从getType()只能得到这个属性的接口类型。但是getGenericType()还可以得到这个泛型的参数类型
  • getGenericType()如果当前属性有签名属性类型就返回,都则就返回Field.getType()
  • 本知识点参考反射API

猜你喜欢

转载自blog.csdn.net/qq_23888451/article/details/84660197