首页 > 编程知识 正文

java代码覆盖率工具(比ewsa更快的跑包工具)

时间:2023-05-03 21:46:54 阅读:84466 作者:603

你还在写无聊又难以维护的POJO吗? 洁癖的春天在哪里? 请看Lombok!

在过去的Java项目中,充满了POJO的getter/setter/toString这一不亲切的代码的异常处理; 这些模板代码没有技术含量,如I/O流的关闭操作,也影响了代码的美观性,于是Lombok应运而生。

首先,无论出现什么技术都是为了解决某种问题。 如果要在此基础上确立奇技淫巧,最好回到Java本身。 不要滥用,要合理使用。

Lombok的使用方法很简单。 一起看看吧。

1 )引入适当的maven软件包:

从属关系

groupid org .项目lombok/groupid

artifactIdlombok/artifactId标识

版本1.16.18 /版本

范围提供/范围

/从属关系

Lombok的scope=provided表示只在编译阶段有效,不需要打入软件包。 这样,Lombok在编译时将包含Lombok注释的Java文件正确编译为完整的Class文件。

2 )添加对Lombok的IDE工具支持:

在IDEA上部署Lombok支持后,将出现以下情况:

单击File-- Settings设置画面,安装Lombok插件:

点击File-- Settings设置画面,打开ann ocation处理程序:

打开此项目是为了使Lombok注释在编译阶段起作用。

Eclipse的Lombok插件的安装可以自己百度,比较简单。 顺便说一下,内置在Eclipse中的编译器不是Oracle javac,而是Eclipse自身安装的EclipsecompilerforJava(ECJ ) .为了使ecj支持Lombok,需要在Eclipse中使用

--xbootclasspath/a : [ lombok.jar所在的路径]

-javaagent:[lombok.jar所在的路径]

3 ) Lombok的实现原理:

从Java 6开始,javac支持“JSR 269可插拔处理程序”规范,只要程序实现了该API,就可以在javac运行时调用该规范。

Lombok是实现“JSR 269 API”的程序。 使用javac时,其发挥作用的具体过程如下。

avac分析源代码,在抽象语法树(AST ) javac编译中调用实现JSR 269的Lombok程序,处理第一步中得到的AST,然后生成与Lombok注释所在的类相对应的语法树) avac

4 )使用Lombok注释:

POJO类的一般注释:

@Getter/@Setter:在活动类上生成所有成员变量的getter/setter方法; 作用于成员变量并生成其成员变量的getter/setter方法。 可以设置访问权限和是否疏忽加载等。

打包课程。

trace; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; /** * Created by Trace on 2018/5/19.<br/> * DESC: 测试类 */ @SuppressWarnings("unused") public class TestClass { public static void main(String[] args) { } @Getter(value = AccessLevel.PUBLIC) @Setter(value = AccessLevel.PUBLIC) public static class Person { private String name; private int age; private boolean friendly; } public static class Animal { private String name; private int age; @Getter @Setter private boolean funny; } }

在Structure视图中,可以看到已经生成了getter/setter等方法:

编译后的代码如下:[这也是传统Java编程需要编写的样板代码]

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.trace; public class TestClass { public TestClass() { } public static void main(String[] args) { } public static class Animal { private String name; private int age; private boolean funny; public Animal() { } public boolean isFunny() { return this.funny; } public void setFunny(boolean funny) { this.funny = funny; } } public static class Person { private String name; private int age; private boolean friendly; public Person() { } public String getName() { return this.name; } public int getAge() { return this.age; } public boolean isFriendly() { return this.friendly; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setFriendly(boolean friendly) { this.friendly = friendly; } } }

@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。

@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode

@NonNull:主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。

staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。

@NoArgsConstructor:生成无参构造器;

@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;

@AllArgsConstructor:生成全参构造器。

编译后结果:

public static class Person { @NonNull private String name; private int age; private boolean friendly; public String toString() { return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")"; } @NonNull public String getName() { return this.name; } public int getAge() { return this.age; } public boolean isFriendly() { return this.friendly; } public void setName(@NonNull String name) { if(name == null) { throw new NullPointerException("name"); } else { this.name = name; } } public void setAge(int age) { this.age = age; } public void setFriendly(boolean friendly) { this.friendly = friendly; } private Person() { } private static TestClass.Person of() { return new TestClass.Person(); } @ConstructorProperties({"name"}) Person(@NonNull String name) { if(name == null) { throw new NullPointerException("name"); } else { this.name = name; } } @ConstructorProperties({"name", "age", "friendly"}) public Person(@NonNull String name, int age, boolean friendly) { if(name == null) { throw new NullPointerException("name"); } else { this.name = name; this.age = age; this.friendly = friendly; } } }

@Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

@Builder:作用于类上,将类转变为建造者模式

@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:

其他重要注解:

@Cleanup:自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象

编译后结果如下:

是不是简洁了太多。

@SneakyThrows:可以对受检异常进行捕捉并抛出,可以改写上述的main方法如下:

@Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大。

作者:LiWenD正在掘金

juejin.im/post/5b00517cf265da0ba0636d4b

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。