Java 自定义注解实现和com.sun.image.codec.jpeg.JPEGImageEncoder报错 mac

自定义注解实现

网上找的参考

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之后在删除了,所以找不到是正常的。

  1. java环境下去引入两个jar
  2. 编译用1.8的吧,应该lamb表达式啊,很多新语法,不用编译不了
  3. 核心: 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
地址在这,希望以后有遇到这种问题的朋友,能快速解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值