lombok的简单介绍
##lombok的使用
一直在使用lombok的set和get,对其他的功能用的比较少,蓦然发现这个库好用的功能不要太多啊
有必要深入理解一番。
###lombok安装
1 需要IDE支持,不然开发的时候都会报错
2 需要加载依赖的安装包
###lombok提供的注解功能说明
```
@Data
@Setter
@Getter
@Log4j
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@NonNull
@Cleanup
@ToString
@RequiredArgsConstructor
@Value
@SneakyThrows
@Synchronized
```
@Setter和@Getter
注解在 类 上;提供属性的get和set
@Data
注解在 类 上;提供类所有属性的 get 和 set 方法,此外还提供了equals、canEqual、hashCode、toString 方法。
@Log4j @Slf4j
注解在 类 上;为类提供一个 属性名为 log 的 log4j 日志对象,提供默认构造方法。
@Slf4j 使用slf4j提供日志服务,这个稍后会讲到
@AllArgsConstructor
注解在 类 上;为类提供一个全参的构造方法,加了这个注解后,类中不提供默认构造方法了。
@NoArgsConstructor
注解在 类 上;为类提供一个无参的构造方法。
@EqualsAndHashCode
可以生成 equals、canEqual、hashCode 方法。
@NonNull
注解在 属性 上,会自动产生一个关于此参数的非空检查,
如果参数为空,则抛出一个空指针异常,也会有一个默认的无参构造方法。
@Cleanup
这个注解用在 变量 前面,可以保证此变量代表的资源会被自动关闭,
默认是调用资源的 close() 方法,
如果该资源有其它关闭方法,可使用 @Cleanup(“methodName”) 来指定要调用的方法,
也会生成默认的构造方法
@RequiredArgsConstructor
这个注解用在 类 上,使用类中所有带有 @NonNull
注解的或者带有 final 修饰的成员变量生成对应的构造方法。
@Value
这个注解用在 类 上,会生成含所有参数的构造方法,get 方法,
此外还提供了equals、hashCode、toString 方法。
@SneakyThrows
这个注解用在 方法 上,可以将方法中的代码用 try-catch 语句包裹起来,
捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出,
可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常,也会生成默认的构造方法。
@SneakyThrows
这个注解用在 方法 上,可以将方法中的代码用 try-catch 语句包裹起来,
捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出,
可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常,也会生成默认的构造方法。
@Synchronized
这个注解用在类方法或者实例方法上,效果和 synchronized 关键字相同,
区别在于锁对象不同,对于类方法和实例方法,
synchronized 关键字的锁对象分别是类的 class 对象和 this 对象,
而 @Synchronized 的锁对象分别是
私有静态 final对象,
私有final对象,
当然,也可以自己指定锁对象,此外也提供默认的构造方法。
本节参考:
https://zhuanlan.zhihu.com/p/32779910
###lombok的原理
插入式注解处理API
自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,
只要程序实现了该API,就能在javac运行的时候得到调用。

JSR 的例子,暂时没有,等我写java虚拟机的时候一并补上。胡乱立flag会不会有完成不了的风险=。=
相关的代码
package test.lombok;
public class LombokTest {
public static void main(String[] args){
tData();
testLog();
testClean();
testException();
tesSync();
}
//修改lomok data注解
public static void tData(){
LomokData lomokData = new LomokData();
lomokData.setName("abc");
System.out.println(lomokData.getName());
//equal
LomokData lomokData2 = new LomokData();
lomokData2.setName("abc");
System.out.println(lomokData.equals(lomokData2));
//canEqual
System.out.println(lomokData.canEqual(lomokData2));
//tostring
System.out.println(lomokData.toString());
//hashCode
System.out.println(lomokData.hashCode());
//@Slf4j
//LomokData.testLog();
//toString
System.out.println(lomokData);
}
//@AllArgsConstructor
//@NoArgsConstructor
public static void testArgs(){
LommokLog lommokLog1 = new LommokLog();
lommokLog1.setCountry(null);
}
public static void testLog(){
LommokLog.testLog();
}
//@Cleanup
public static void testClean(){
try{
TestCleanUp.fileCopy();
}catch (Exception e){
e.printStackTrace();
}
}
public static void testException(){
TestThrow.openIo();
}
//测试锁
public static void tesSync(){
TestSync testSync = new TestSync();
int number = 10;
SyncIt syncItArr[] = new SyncIt[number];
for (int i =0; i < number;i++){
syncItArr[i] = new SyncIt(testSync);
new Thread(syncItArr[i],"thread-"+i).start();
}
TestSync.sleepIt(60);
}
}
class SyncIt implements Runnable{
private TestSync testSync;
public SyncIt(TestSync testSync){
this.testSync = testSync;
}
@Override
public void run() {
testSync.h3();
}
}
package test.lombok;
import lombok.Synchronized;
import java.util.concurrent.TimeUnit;
public class TestSync {
private final Object readLock = new Object();
@Synchronized
public static void h1(){
System.out.println("h1");
}
@Synchronized
public int h2(){
sleepIt(3);
return 12;
}
@Synchronized
public void h3(){
System.out.println("!!");
sleepIt(3);
}
@Synchronized("readLock")
public void foo(){
System.out.println("foo");
}
public static void sleepIt(int n){
try{
TimeUnit.SECONDS.sleep(n);
}catch (Exception e){
e.printStackTrace();
}
}
}
package test.lombok;
import lombok.Cleanup;
import lombok.SneakyThrows;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class TestThrow {
@SneakyThrows(IOException.class)
public static void openIo(){
@Cleanup InputStream inputStream = new FileInputStream("/data1/applogs/flogger/2019-01-31/info.log.copy");
}
}
package test.lombok;
import lombok.*;
import lombok.extern.log4j.Log4j;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
@Log4j
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@EqualsAndHashCode
@ToString
//@RequiredArgsConstructor
public class LommokLog {
@NonNull
private int id;
private String name;
private String country;
public static void testLog(){
log.info("test123");
}
}
class TestCleanUp{
public static void fileCopy() throws Exception{
String filename = "/data1/applogs/flogger/2019-01-31/info.log";
String filenameCopy = "/data1/applogs/flogger/2019-01-31/info.log.copy";
@Cleanup InputStream in = new FileInputStream(filename);
@Cleanup OutputStream out = new FileOutputStream(filenameCopy);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
本节参考:
https://github.com/coderzhw/blog/issues/6
https://blog.csdn.net/zhuhai__yizhi/article/details/49999151
lombok的简单介绍的更多相关文章
- lombok 注解简单介绍
一.Lombok 的简单介绍和使用 Lombok是一个可以帮助我们简化 Java 代码编写的工具类,通过采用注解的方式简化了 JavaBean 的编写,使我们写的类更加简洁. 1. 添加 Lombok ...
- lombok的简单介绍和使用方法
这是上周在群里发现有人推荐lombok,他说是神器,当时就引起了我的好奇,然后下班回来我就看了看官网介绍(菜鸟英语水平),这就是难点了,然后就是大概了解了一下,就在网上查了查相关资料,周末的时候自己试 ...
- lombok的简单介绍(1)
一.项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省 ...
- lombok的简单介绍(2)
在和idea中整合遇到这样问题,实体对象不提示lombok的get/set方法,从网上找到以下方法,分享给大家
- [原创]关于mybatis中一级缓存和二级缓存的简单介绍
关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...
- 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...
- 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍
一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...
- yii2的权限管理系统RBAC简单介绍
这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...
- angular1.x的简单介绍(二)
首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...
随机推荐
- [论文阅读]Object detection at 200 Frames Per Second
本文提出了一个有效且快速的目标检测器,该目标检测器得速度可以达到200+fps,在Pascal VOC-2007上的mAP比Tiny-Yolo-v2高出14. 本文从以下三个方面对网络进行改进. 网络 ...
- java基础回忆、复习(一)
一:浅拷贝与深拷贝: 对于基本数据类型,直接进行拷贝,String类型,有两种拷贝方式: 1:直接将原对象中的name的引用值拷贝给新对象的name字段.<浅拷贝> 2:根据原对象中的na ...
- leetcode每日刷题计划-简单篇day11
Num 121 买卖股票的最佳时期 Best Time to Buy and Sell Stock class Solution { public: int maxProfit(vector<i ...
- Flask 里的WEB表单应用
它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器. 创建模板文件 login. ...
- Linux 文件目录管理命令
1.touch 用于设置空白文件或设置文件时间 touch命令参数及作用 参 数 ...
- [DOM]初识DOM
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象 ...
- azkaban架构介绍
转自:https://blog.csdn.net/huoji1990/article/details/81911904 官网:https://azkaban.readthedocs.io/en/lat ...
- R语言输出高质量图片
Rstudio画图之后保存的 图片格式如下 上面的几种格式可以直接插入word文档中,但是图片质量很低,锯齿感很明显.若生成PDF,为矢量图(不懂),但是不可以插入word文档中. 最简便的方法就是对 ...
- WPF 主窗口关闭时结束所有相关线程
程序主窗口的 Closed 事件中添加代码: Process.GetCurrentProcess().Kill();
- ---rk3288 mipi 整发(适用于新版的kernel 4.4 )
http://www.pianshen.com/article/7245318143/ 老的Anroid 5.1 下 Linux 3.10 的数据的名字和 处理方式有不少不同 不过rk3128 还在走 ...