自定义注解实现
网上找的参考
Target:描述了注解修饰的对象范围,取值在java.lang.annotation.ElementType定义,常用的包括:
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述方法变量
TYPE:用于描述类、接口或enum类型
Retention: 表示注解保留时间长短。取值在java.lang.annotation.RetentionPolicy中,取值为:
SOURCE:在源文件中有效,编译过程中会被忽略
CLASS:随源文件一起编译在class文件中,运行时忽略
RUNTIME:在运行时有效
作者:快给我饭吃
链接:https://www.jianshu.com/p/a7bedc771204
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
@Target(ElementType.FIELD) // 注解用于字段上
@Retention(RetentionPolicy.RUNTIME) // 保留到运行时,可通过注解获取
public @interface MyField {
String description();
int length();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyField {
String description();
int length();
}
public class MyFieldTest {
//使用我们的自定义注解
@MyField(description = "用户名", length = 12)
private String username;
@Test
public void testMyField(){
// 获取类模板
Class c = MyFieldTest.class;
// 获取所有字段
for(Field f : c.getDeclaredFields()){
// 判断这个字段是否有MyField注解
if(f.isAnnotationPresent(MyField.class)){
MyField annotation = f.getAnnotation(MyField.class);
System.out.println("字段:[" + f.getName() + "], 描述:[" + annotation.description() + "], 长度:[" + annotation.length() +"]");
}
}
}
}
自己实现
我这业务是比较两个对象参数是否一致,不一致的话需要每一条都记录一下日志
我在需要记录日志的字段上加了自定义的注解,然后通过反射去拿,如果没有的话说明不需要(自己加的业务字段或者冗余字段,别人上报是没有的),有的参数去进行比对
注解类
@Documented
@Target({ElementType.FIELD}) //注解应用类型(应用到方法的注解,还有类的可以自己试试)
@Retention(RetentionPolicy.RUNTIME) // 注解的类型
public @interface UseAnnotation {
String value() default "";
}
实体类
@Data
public class JcOrgInfoUse implements Serializable {
private static final long serialVersionUID = 689364380486134140L;
/**
* 单位ID
*/
private Integer unitId;
/**
* 单位名称
*/
@UseAnnotation("单位名称")
private String unitName;
/**
* 社会信用代码
*/
@UseAnnotation("社会信用代码")
private String unitCode;
/**
* 行业主管部门
*/
@UseAnnotation("行业主管部门")
private String belongDept;
/**
* 邮政编码
*/
@UseAnnotation("邮政编码")
private String postCode;
/**
* 规模类型
*/
@UseAnnotation("规模类型")
private String scaleType;
/**
* 地区办公所在地区
*/
@UseAnnotation("地区办公所在地区")
private String areaCode;
/**
* 地区编码:省
*/
private String areaCodeL1;
/**
* 地区编码:市
*/
private String areaCodeL2;
/**
* 地区编码:区县
*/
private String areaCodeL3;
/**
* 地区编码:街道
*/
private String areaCodeL4;
/**
* 办公所在详细地址
*/
@UseAnnotation("办公所在详细地址")
private String unitAddr;
/**
* 注册所在地
*/
@UseAnnotation("注册所在地")
private String regAddr;
/**
* 单位电话
*/
@UseAnnotation("单位电话")
private String unitTel;
具体实现
先都转成json然后通过反射获取比对
private void InUseLog(JcOrgInfoUse newJcOrgInfoUse, JcOrgInfoUse oldJcOrgInfoUse, JcOrgInfoLog jcOrgInfoLog) {
try {
JSONObject newJson = (JSONObject) JSON.toJSON(newJcOrgInfoUse);
JSONObject oldJson = (JSONObject) JSON.toJSON(oldJcOrgInfoUse);
// 获取类模板
Class c = JcOrgInfoUse.class;
// 获取所有字段
for (Field f : c.getDeclaredFields()) {
// 判断这个字段是否有UseAnnotation注解
if (f.isAnnotationPresent(UseAnnotation.class)) {
String fieldName = f.getName();
String newField = newJson.getString(fieldName);
String oldField = oldJson.getString(fieldName);
//如果这两个值不想等的话,获取注解的值,然后操作一下
if (!newField.equals(oldField)) {
UseAnnotation annotation = f.getAnnotation(UseAnnotation.class);
jcOrgInfoLog.setModifyField(annotation.value());//修改字段
jcOrgInfoLog.setOriginalValue(oldField);//原值
jcOrgInfoLog.setModifyValue(newField);//修改值
jcOrgInfoLogDao.insert(jcOrgInfoLog);
}
}
}
} catch (SecurityException e) {
log.error("使用单位记录日志报错");
log.error(e);
}
}
JPEGImageEncoder报错
问题
程序包com.sun.image.codec.jpeg不存在
这个是因为少了一个rt.jar的包,解决办法网上有很多,我这因为是mac的,刚装了环境,用的是azul-1.8.0_292这个版本的jdk,这个jdk编译确实很快,不过就是找不到这个,其实jre/lib本身是有携带rt.jar的,但是似乎是版本还是什么原因一只说找不到,maven换了,问大哥拿了rt.jar导入进去使用,应该是编译不一致,还是报找不到
不饶圈子,直接上干货
解决办法
rt.jar在jdk1.6之后在删除了,所以找不到是正常的。
- java环境下去引入两个jar
- 编译用1.8的吧,应该lamb表达式啊,很多新语法,不用编译不了
- 核心: j a v a . h o m e / l i b / r t . j a r : {java.home}/lib/rt.jar: java.home/lib/rt.jar:{java.home}/lib/jce.jar
A.在window是; (分号) 在mac是:(冒号)
B.两个标签,windows路径用\,mac,linux用/
pom.xml
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments><verbose/>
<bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<forkMode>once</forkMode>
<argLine>-Dfile.encoding=UTF-8</argLine>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
到这里基本上应该解决了,如果还是有问题的话,建议换jdk!!!(题主就是这种情况,用zuul的jdk导致还是不行,最终换了jdk1.8.0_211.jdk),就都通过了
链接: https://pan.baidu.com/s/1goBH-spTIxB3fL898zOhJg 密码: sacr
地址在这,希望以后有遇到这种问题的朋友,能快速解决