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)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...
随机推荐
- mac与Windows系统支持软件汇总
踩过的坑,记录下
- apue第九章之孤儿进程组
1. 为什么会有孤儿进程组的概念,APUE没直接写,但是GNU有规定: 孤儿进程组不可以获得终端,这是为了保证控制进程死掉后他的终端可以安全分配给新session.posix要求向新孤儿进程组中停止状 ...
- MSMQ 队列消息和死信队列
日志消息 日志队列可以保存你操作过的消息的备份.它的好处是,一但发现前面的操作失败,可以从日志队列中重新创建出原先的消息对象,然后再进行操作. 例如,向远方发送一个消息对象,然后对方返回一个失败的确认 ...
- asp.net 微信开发(一)
在准备工作中,我们已经完成准备工作,接下来就是进行开发啦,应该怎么来开发呢??容我想想...我觉得我们可以直接让用户的消息发送到微信的消息,转到我们自己的服务器上面!!感觉好厉害的样子 1.首先写 验 ...
- python学习笔记---环境的安装,pip命令,数据类型,运算
1.进入python环境: python 2:py -2 python 3:py -3 2.退出python环境 exit()/quit()/ctrl+z+enter ctrl+z+enter没有尝试 ...
- vChart
vue+echarts工具: https://v-charts.js.org
- Java爬虫——常用的maven依赖
java实现爬虫常用的第三方包: httpclient,for http jsoup,for dom rhino,for js jackson,for json pom.xml摘录 <depen ...
- python之路:数据类型初识
python开发之路:数据类型初识 数据类型非常重要.不过我这么说吧,他不重要我还讲个屁? 好,既然有人对数据类型不了解,我就讲一讲吧.反正这东西不需要什么python代码. 数据类型我讲的很死板.. ...
- 如何配置mysql的超时时间
http://bigdata.51cto.com/art/201710/555377.htm
- VS2015环境下的提示语法错误:编号的预期结尾后有多余文本(extra text after expected end of number)
当工程中有扩展CListCtrl的类代码,并且有自绘单元格的操作, ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw) 编辑器语法智能提示就会对这个宏定义 ...