lombok注解
对于需要关闭资源的对象
自动添加关闭资源的行为,例如java中io需要close
@Cleanup
使用范围
使用范围 | 使用范围介绍 |
---|---|
LOCAL_VARIABLE(局部变量) | 被注解的对象自动生成调用关闭资源的方法 |
注解
@Target(ElementType.LOCAL_VARIABLE)
//只保留在源码中
@Retention(RetentionPolicy.SOURCE)
public @interface Cleanup {}
属性
属性 | 入参 | 属性含义 |
---|---|---|
value | String,默认"close" | 定义关闭资源方法的名字 |
源码
public class CleanupTest{
public void hi() throws CleanupTestSonException{
System.out.println("invoke CleanupTest hi");
}
//关闭资源类
public void ctcolse() throws CleanupTestParentException{
System.out.println("invoke CleanupTest");
}
//抛出hi方法CleanupTestSonException异常时
public static void main(String[] args) throws CleanupTestSonException {
//定义关闭资源的名字ctcolse
@Cleanup(value = "ctcolse")
CleanupTest cleanupTest = new CleanupTest();
cleanupTest.hi();
}
}
//自定义一个CleanupTestParentException异常
class CleanupTestParentException extends Exception{}
//自定义一个CleanupTestSonException异常
class CleanupTestSonException extends CleanupTestParentException{
}
编译报错后
指明需要抛出关闭资源方法的异常
修改后
public static void main(String[] args) throws CleanupTestParentException{}
成功编译
class字节码反编译后
public class CleanupTest {
public CleanupTest() {
}
public void hi() throws CleanupTestSonException {
System.out.println("invoke CleanupTest hi");
}
public void ctcolse() throws CleanupTestParentException {
System.out.println("invoke CleanupTest ctcolse");
}
public static void main(String[] args) throws CleanupTestParentException {
CleanupTest cleanupTest = new CleanupTest();
try {
cleanupTest.hi();
} finally {
if (Collections.singletonList(cleanupTest).get(0) != null) {
//调用了关闭资源的方法
cleanupTest.ctcolse();
}
}
}
}
执行结果
同步
官方说:当使用synchronized
关键字时,普通方法将锁定当前对象this
上,在静态方法的情况下锁定的为class
,代码有可能锁定同一对象,从而导致死锁。
建议:在一个单独的对象上显式地锁定,及synchronized(){}
同步代码块的方式
@Synchronized
使用范围
使用范围 | 使用范围描述 |
---|---|
METHOD | 被注释的方法的方法类容使用同步代码块的形式包裹 |
@Target(ElementType.METHOD)
//只保留在源码中
@Retention(RetentionPolicy.SOURCE)
public @interface Synchronized {}
源码
public class User{
@Synchronized
public void synTest(){
System.out.println("invoke User synTest");
}
}
class字节码反编译
public class User extends SuperUser {
//锁(同步监视器)是自动生成的
private final Object $lock = new Object[0];
public User() {
}
public void synTest() {
synchronized(this.$lock) {
System.out.println("invoke User synTest");
}
}
}
属性
属性 | 入参 | 属性描述 |
---|---|---|
value | String,默认为"" | 自定一锁(同步监视器)是那一把 |
源码
public class User{
private String uid;
@Synchronized(value = "uid")
public void synTest(){
System.out.println("invoke User synTest");
}
}
class字节码反编译后
public class User extends SuperUser {
private String uid;
public User() {
}
public void synTest() {
synchronized(this.uid) {
System.out.println("invoke User synTest");
}
}
}
异常抛出声名
@SneakyThrows
以try.catch
的形式自动生成异常且抛出
使用范围
使用范围 | 使用范围描述 |
---|---|
METHOD | 自动给普通方法增加try.catch |
CONSTRUCTOR | 自动给构造方法增加try.catch |
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.SOURCE)
public @interface SneakyThrows {}
源码
public class User extends SuperUser{
@SneakyThrows
public User() {
System.out.println("invoke User Constructor");
}
@SneakyThrows
public void tryCatchTest(){
System.out.println("invoke User tryCatchTest");
}
class字节码反编译后
public class User extends SuperUser {
public User() {
try {
System.out.println("invoke User Constructor");
} catch (Throwable var2) {
throw var2;
}
}
public void tryCatchTest() {
try {
System.out.println("invoke User tryCatchTest");
} catch (Throwable var2) {
throw var2;
}
}
}
属性
属性 | 入参 | 属性描述 |
---|---|---|
value | Class<? extends Throwable>[] (异常类的class对象数组),默认java.lang.Throwable.class | 根据先后入参的先后顺序自动生成try.catch |
源码
public class User{
@SneakyThrows({NullPointerException.class,IndexOutOfBoundsException.class })
public void tryCatchTest(){
System.out.println("invoke User tryCatchTest");
}
}
class字节码反编译后
public class User extends SuperUser {
public void tryCatchTest() {
//2.在生成IndexOutOfBoundsException异常
try {
//1.先生成NullPointerException异常
try {
System.out.println("invoke User tryCatchTest");
} catch (NullPointerException var2) {
throw var2;
}
} catch (IndexOutOfBoundsException var3) {
throw var3;
}
}
}