创建对象列中文注解并通过反射读取使用
2018-02-05 10:31
681 查看
业务需求:需要记录修改前后具体的改变数据,为获取列的中文描述,以存入日志方便显示到前台上,需要创建自定义注解
1.自定义注解类:
2.编写反射方法,进行前后比较:
3.(额外)将注解添加到生成模板上,直接生成:
1.自定义注解类:
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) //运行时保留 @Target({ElementType.FIELD}) //注解使用在字段上 @Documented //JAVADOC public @interface DataName { /** * 字段名称 * @return */ String name() default ""; }
2.编写反射方法,进行前后比较:
/** * 获取两个对象同名属性内容不相同的列表 * @param class1 old对象 * @param class2 new对象 * @return * @throws ClassNotFoundException * @throws IllegalAccessException */ public static List<Map<String ,Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException { List<Map<String,Object>> list=new ArrayList<Map<String, Object>>(); //获取对象的class Class<?> clazz1 = class1.getClass(); Class<?> clazz2 = class2.getClass(); //获取对象的属性列表 Field[] field1 = clazz1.getDeclaredFields(); Field[] field2 = clazz2.getDeclaredFields(); StringBuilder sb=new StringBuilder(); //遍历属性列表field1 for(int i=0;i<field1.length;i++) { //遍历属性列表field2 for (int j = 0; j < field2.length; j++) { //如果field1[i]属性名与field2[j]属性名内容相同 if (field1[i].getName().equals(field2[j].getName())) { if (field1[i].getName().equals(field2[j].getName())) { field1[i].setAccessible(true); field2[j].setAccessible(true); //如果field1[i]属性值与field2[j]属性值内容不相同 if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) { Map<String, Object> map2 = new HashMap<String, Object>(); DataName name=field1[i].getAnnotation(DataName.class); String fieldName=""; if(name!=null){ fieldName=name.name(); }else { fieldName=field1[i].getName(); } map2.put("name", fieldName); map2.put("old", field1[i].get(class1)); map2.put("new", field2[j].get(class2)); list.add(map2); } break; } } } } return list; } /** * 对比两个数据是否内容相同 * * @param object1,object2 * @return boolean类型 */ public static boolean compareTwo(Object object1,Object object2){ if(object1==null&&object2==null){ return true; } if(object1==null&&object2!=null){ return false; } if(object1.equals(object2)){ return true; } return false; }
3.(额外)将注解添加到生成模板上,直接生成:
@TableName("${tableName}") public class ${className} extends Model<${className}> { private static final long serialVersionUID=1L; #foreach ($column in $columns) #if($column.columnName == $pk.columnName) //$column.comments @TableId(value="id", type= IdType.AUTO) #if($column.comments) @DataName(name="$column.comments") #end private $column.attrType $column.attrname; #elseif($column.columnName == "delete_flag") @TableField("$column.columnName") @TableLogic #if($column.comments) @DataName(name="$column.comments") #end private $column.attrType $column.attrname; #else //$column.comments @TableField("$column.columnName") #if($column.comments) @DataName(name="$column.comments") #end private $column.attrType $column.attrname; #end
相关文章推荐
- 直接使用XIB/NIB文件,读取信息创建 UIView [通过Nib文件进行反序列化,得到对象]
- 读取XML数据时,已超过最大字符串内容长度配额(8192)。可以通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象上的MaxStringContentLength属
- 通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxArrayLength 属性,可增加此配额
- 使用web服务时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLen
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。【轉】
- 300.33通过读取配置文件方式来使用反射完成实例对象调用方法
- 09_通过读取配置文件的方式来使用反射完成对实例对象方法调用
- 读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- WCF:读取 XML 数据时,超出最大字符串内容长度配额 (8192)。通过更改在创建 XML 读取器时所使用的 XmlDictionaryReaderQuotas 对象的 MaxStringContentLength 属性,可增加此配额。
- Java通过反射机制使用非默认构造器创建对象
- Java通过反射创建对象
- Java通过反射创建对象
- Java通过反射创建对象
- sphinx4 如何通过反射创建对象
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- protobuf在java应用中通过反射动态创建对象(DynamicMessage)
- 反射的使用---创建对象
- 通过反射创建对象
- 抽象工厂模式:简单工厂模式、工厂方法模式对比;在工厂方法模式中使用反射创建对象实例