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)伸手获得,主要解决模块间的耦合关系.那么模块是又什么组成的呢?在我看来,模块的最小单位是类,多个类的组合就是模块.关于在根模块 ...
随机推荐
- scrapy-redis
scrapy_redis的大概思路:将爬取的url通过 hashlin.sha1生成唯一的指纹,持久化存入redis,之后的url判断是否已经存在,达到去重的效果 下载scrapy-redis git ...
- gradle指定相应JDK编译
转载请注明出处: http://blog.csdn.net/sanyinchen/article/details/50901582 问题描述: 电脑中装有多个jdk版本,可能默认的jdk是1.6,但是 ...
- WebView内容自适应
webview页面自适应 //适应内容大小 start webSetting.setUseWideViewPort(true); webSetting.setLayoutAlgorithm(WebSe ...
- 在linux上安装docker
我的linux系统是阿里云服务器,是centos版本的. 前置条件 64-bit 系统 kernel 3.10+ 用uname -r命令检查内核版本,返回的值大于3.10即可. 用sudo wget ...
- 新年Flag,零基础程序媛编程学习计划(持续更新ing)~~
新的一年立下了转行做程序媛的Flag,我是文科妹子,专业是做市场传销…哦不,是市场营销,算是零基础转行,目标是半年内完成自学进入公司工作,目前打算从事的方向短期目标以入行为主,以前端(可以发挥自身审美 ...
- CSS 文字太多用省略号表示
width:150px;/*要显示文字的宽度*/ overflow:hidden; /*超出的部分隐藏起来.*/ white-space:nowrap;/*不显示的地方用省略号...代替*/ text ...
- Linux gzip命令
语法: gzip [-acdfhlLnNqrtvV][-S <压缩字尾字符串>][-<压缩效率>][--best/fast][文件...] 或 gzip [-acdfhlLnN ...
- UE4 C++ 笔记
1.获取当前的GameMode:GameMode = Cast<你GameMode的类名>( UGameplayStatics::GetGameMode(this)); 2.输出日志Deb ...
- Pycharm配置支持vue语法
1. 2. 3. 4. 5.
- bash小技巧1 获取文件当前路径
我们linux获取文件当前路径一般问 #逼格不够高 [root@xxxx]# pwd 高逼格 SHELL_FOLDER=$(dirname $(readlink -f "$0"))