##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的简单介绍的更多相关文章

  1. lombok 注解简单介绍

    一.Lombok 的简单介绍和使用 Lombok是一个可以帮助我们简化 Java 代码编写的工具类,通过采用注解的方式简化了 JavaBean 的编写,使我们写的类更加简洁. 1. 添加 Lombok ...

  2. lombok的简单介绍和使用方法

    这是上周在群里发现有人推荐lombok,他说是神器,当时就引起了我的好奇,然后下班回来我就看了看官网介绍(菜鸟英语水平),这就是难点了,然后就是大概了解了一下,就在网上查了查相关资料,周末的时候自己试 ...

  3. lombok的简单介绍(1)

    一.项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省 ...

  4. lombok的简单介绍(2)

    在和idea中整合遇到这样问题,实体对象不提示lombok的get/set方法,从网上找到以下方法,分享给大家

  5. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  6. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  7. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  8. yii2的权限管理系统RBAC简单介绍

    这里有几个概念 权限: 指用户是否可以执行哪些操作,如:编辑.发布.查看回帖 角色 比如:VIP用户组, 高级会员组,中级会员组,初级会员组 VIP用户组:发帖.回帖.删帖.浏览权限 高级会员组:发帖 ...

  9. angular1.x的简单介绍(二)

    首先还是要强调一下DI,DI(Denpendency Injection)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...

随机推荐

  1. [论文阅读]Object detection at 200 Frames Per Second

    本文提出了一个有效且快速的目标检测器,该目标检测器得速度可以达到200+fps,在Pascal VOC-2007上的mAP比Tiny-Yolo-v2高出14. 本文从以下三个方面对网络进行改进. 网络 ...

  2. java基础回忆、复习(一)

    一:浅拷贝与深拷贝: 对于基本数据类型,直接进行拷贝,String类型,有两种拷贝方式: 1:直接将原对象中的name的引用值拷贝给新对象的name字段.<浅拷贝> 2:根据原对象中的na ...

  3. leetcode每日刷题计划-简单篇day11

    Num 121 买卖股票的最佳时期 Best Time to Buy and Sell Stock class Solution { public: int maxProfit(vector<i ...

  4. Flask 里的WEB表单应用

    它是HTML页面中负责数据采集的部件.表单有三个部分组成:表单标签.表单域.表单按钮.表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器. 创建模板文件 login. ...

  5. Linux 文件目录管理命令

    1.touch 用于设置空白文件或设置文件时间 touch命令参数及作用 参 数                                                             ...

  6. [DOM]初识DOM

    文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象 ...

  7. azkaban架构介绍

    转自:https://blog.csdn.net/huoji1990/article/details/81911904 官网:https://azkaban.readthedocs.io/en/lat ...

  8. R语言输出高质量图片

    Rstudio画图之后保存的 图片格式如下 上面的几种格式可以直接插入word文档中,但是图片质量很低,锯齿感很明显.若生成PDF,为矢量图(不懂),但是不可以插入word文档中. 最简便的方法就是对 ...

  9. WPF 主窗口关闭时结束所有相关线程

    程序主窗口的 Closed 事件中添加代码: Process.GetCurrentProcess().Kill();

  10. ---rk3288 mipi 整发(适用于新版的kernel 4.4 )

    http://www.pianshen.com/article/7245318143/ 老的Anroid 5.1 下 Linux 3.10 的数据的名字和 处理方式有不少不同 不过rk3128 还在走 ...