Java.lang.Illegalaccessexception 或 java.lang.NoSuchMethodError
时间:2022-07-25
本文章向大家介绍Java.lang.Illegalaccessexception 或 java.lang.NoSuchMethodError,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
lombok@Data和@Builder一起用无法添加无参构造方法的坑
今天和小伙伴讨论一个mybatis-plus的一个诡异问题,最后定位到原因竟然是lombok@Data和@Builder一起用无法添加无参构造方法引起的,非常隐蔽。
很多框架都是同反射等调用无参数构造方法来创建实例的,需要注意。
单独使用@Data注解,编译后的类文件会生成无参数构造方法(这并不是@Data提供的特性,而是Java自带的特性)。
// IntelliJ API Decompiler stub source generated from a class file // Implementation of methods is not available package com.chujianyun.util; public class Dog { private java.lang.String name; private java.lang.Integer age; private java.lang.String nickName; private java.lang.String test; public Dog() { /* compiled code */ } public java.lang.String getName() { /* compiled code */ } public java.lang.Integer getAge() { /* compiled code */ } public java.lang.String getNickName() { /* compiled code */ } public java.lang.String getTest() { /* compiled code */ } public void setName(java.lang.String name) { /* compiled code */ } public void setAge(java.lang.Integer age) { /* compiled code */ } public void setNickName(java.lang.String nickName) { /* compiled code */ } public void setTest(java.lang.String test) { /* compiled code */ } public boolean equals(java.lang.Object o) { /* compiled code */ } protected boolean canEqual(java.lang.Object other) { /* compiled code */ } public int hashCode() { /* compiled code */ } public java.lang.String toString() { /* compiled code */ }}
单独使用@Builder注解,发现生成了全属性的构造方法。
package com.chujianyun.util; public class Dog { private java.lang.String name; private java.lang.Integer age; private java.lang.String nickName; private java.lang.String test; Dog(java.lang.String name, java.lang.Integer age, java.lang.String nickName, java.lang.String test) { /* compiled code */ } public static com.chujianyun.util.Dog.DogBuilder builder() { /* compiled code */ } public static class DogBuilder { private java.lang.String name; private java.lang.Integer age; private java.lang.String nickName; private java.lang.String test; DogBuilder() { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder name(java.lang.String name) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder age(java.lang.Integer age) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder nickName(java.lang.String nickName) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder test(java.lang.String test) { /* compiled code */ } public com.chujianyun.util.Dog build() { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } }}
@Data和@Builder一起用
@Data@Builderpublic class Dog { private String name; private Integer age; private String nickName; private String test; }
效果
// IntelliJ API Decompiler stub source generated from a class file // Implementation of methods is not available package com.chujianyun.util; public class Dog { private java.lang.String name; private java.lang.Integer age; private java.lang.String nickName; private java.lang.String test; Dog(java.lang.String name, java.lang.Integer age, java.lang.String nickName, java.lang.String test) { /* compiled code */ } public static com.chujianyun.util.Dog.DogBuilder builder() { /* compiled code */ } public java.lang.String getName() { /* compiled code */ } public java.lang.Integer getAge() { /* compiled code */ } public java.lang.String getNickName() { /* compiled code */ } public java.lang.String getTest() { /* compiled code */ } public void setName(java.lang.String name) { /* compiled code */ } public void setAge(java.lang.Integer age) { /* compiled code */ } public void setNickName(java.lang.String nickName) { /* compiled code */ } public void setTest(java.lang.String test) { /* compiled code */ } public boolean equals(java.lang.Object o) { /* compiled code */ } protected boolean canEqual(java.lang.Object other) { /* compiled code */ } public int hashCode() { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public static class DogBuilder { private java.lang.String name; private java.lang.Integer age; private java.lang.String nickName; private java.lang.String test; DogBuilder() { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder name(java.lang.String name) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder age(java.lang.Integer age) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder nickName(java.lang.String nickName) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder test(java.lang.String test) { /* compiled code */ } public com.chujianyun.util.Dog build() { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } }}
我们发现外层的Dog类没有了默认的构造方法。
如果手动添加无参数构造方法或者用@NoArgsConstructor注解都会报错!
@Builder@Data@NoArgsConstructorpublic class Dog { private String name; private Integer age; private String nickName; private String test; }
正确写法如下:
@Builder@Datapublic class Dog { private String name; private Integer age; private String nickName; private String test; @Tolerate Dog() {}}
解释如下
添加函数或者构造方法,让lombok假装它不存在(不感知)。
效果如下:
package com.chujianyun.util; public class Dog { private java.lang.String name; private java.lang.Integer age; private java.lang.String nickName; private java.lang.String test; Dog() { /* compiled code */ } Dog(java.lang.String name, java.lang.Integer age, java.lang.String nickName, java.lang.String test) { /* compiled code */ } public static com.chujianyun.util.Dog.DogBuilder builder() { /* compiled code */ } public java.lang.String getName() { /* compiled code */ } public java.lang.Integer getAge() { /* compiled code */ } public java.lang.String getNickName() { /* compiled code */ } public java.lang.String getTest() { /* compiled code */ } public void setName(java.lang.String name) { /* compiled code */ } public void setAge(java.lang.Integer age) { /* compiled code */ } public void setNickName(java.lang.String nickName) { /* compiled code */ } public void setTest(java.lang.String test) { /* compiled code */ } public boolean equals(java.lang.Object o) { /* compiled code */ } protected boolean canEqual(java.lang.Object other) { /* compiled code */ } public int hashCode() { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } public static class DogBuilder { private java.lang.String name; private java.lang.Integer age; private java.lang.String nickName; private java.lang.String test; DogBuilder() { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder name(java.lang.String name) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder age(java.lang.Integer age) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder nickName(java.lang.String nickName) { /* compiled code */ } public com.chujianyun.util.Dog.DogBuilder test(java.lang.String test) { /* compiled code */ } public com.chujianyun.util.Dog build() { /* compiled code */ } public java.lang.String toString() { /* compiled code */ } }}
完美。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释