实验环境说明:
1:JDK 1.8.0_241
2:IDEA IntelliJ 2018.3
3:Lombok 1.18.8
由于Fastjson漏洞比较多,所以,我调研换用Jackson是否OK,在实验的过程中发现了Lombok的一个细节,如果不注意,可能存在问题,问题比较简单,代码一贴基本就能看出来了!
4:源码如下所示
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class TestLombok { private long _long; private Long _Long; private byte _byte; private Byte _Byte; private double _double; private Double _Double; private boolean _boolean; private Boolean _Boolean; private float _float; private Float _Float; private String myName; private String mYnAmE; private String MyNaMe; private String my_name; }
5:生成的反编译字节码如下所示
public class TestLombok { private long _long; private Long _Long; private byte _byte; private Byte _Byte; private double _double; private Double _Double; private boolean _boolean; private Boolean _Boolean; private float _float; private Float _Float; private String myName; private String mYnAmE; private String MyNaMe; private String my_name; public long get_long() { return this._long; } public byte get_byte() { return this._byte; } public double get_double() { return this._double; } public boolean is_boolean() { return this._boolean; } public Boolean get_Boolean() { return this._Boolean; } public float get_float() { return this._float; } public String getMyName() { return this.myName; } public String getMy_name() { return this.my_name; } public void set_long(long _long) { this._long = _long; } public void set_byte(byte _byte) { this._byte = _byte; } public void set_double(double _double) { this._double = _double; } public void set_boolean(boolean _boolean) { this._boolean = _boolean; } public void set_float(float _float) { this._float = _float; } public void setMyName(String myName) { this.myName = myName; } public void setMy_name(String my_name) { this.my_name = my_name; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof TestLombok)) { return false; } else { TestLombok other = (TestLombok)o; if (!other.canEqual(this)) { return false; } else if (this.get_long() != other.get_long()) { return false; } else if (this.get_long() != other.get_long()) { return false; } else if (this.get_byte() != other.get_byte()) { return false; } else if (this.get_byte() != other.get_byte()) { return false; } else if (Double.compare(this.get_double(), other.get_double()) != 0) { return false; } else if (Double.compare(this.get_double(), other.get_double()) != 0) { return false; } else { label106: { Object this$_boolean = this.get_Boolean(); Object other$_boolean = other.get_Boolean(); if (this$_boolean == null) { if (other$_boolean == null) { break label106; } } else if (this$_boolean.equals(other$_boolean)) { break label106; } return false; } Object this$_Boolean = this.get_Boolean(); Object other$_Boolean = other.get_Boolean(); if (this$_Boolean == null) { if (other$_Boolean != null) { return false; } } else if (!this$_Boolean.equals(other$_Boolean)) { return false; } if (Float.compare(this.get_float(), other.get_float()) != 0) { return false; } else if (Float.compare(this.get_float(), other.get_float()) != 0) { return false; } else { label89: { Object this$myName = this.getMyName(); Object other$myName = other.getMyName(); if (this$myName == null) { if (other$myName == null) { break label89; } } else if (this$myName.equals(other$myName)) { break label89; } return false; } Object this$mYnAmE = this.getMyName(); Object other$mYnAmE = other.getMyName(); if (this$mYnAmE == null) { if (other$mYnAmE != null) { return false; } } else if (!this$mYnAmE.equals(other$mYnAmE)) { return false; } label75: { Object this$MyNaMe = this.getMyName(); Object other$MyNaMe = other.getMyName(); if (this$MyNaMe == null) { if (other$MyNaMe == null) { break label75; } } else if (this$MyNaMe.equals(other$MyNaMe)) { break label75; } return false; } Object this$my_name = this.getMy_name(); Object other$my_name = other.getMy_name(); if (this$my_name == null) { if (other$my_name != null) { return false; } } else if (!this$my_name.equals(other$my_name)) { return false; } return true; } } } } protected boolean canEqual(Object other) { return other instanceof TestLombok; } public int hashCode() { int PRIME = true; int result = 1; long $_long = this.get_long(); int result = result * 59 + (int)($_long >>> 32 ^ $_long); long $_Long = this.get_long(); result = result * 59 + (int)($_Long >>> 32 ^ $_Long); result = result * 59 + this.get_byte(); result = result * 59 + this.get_byte(); long $_double = Double.doubleToLongBits(this.get_double()); result = result * 59 + (int)($_double >>> 32 ^ $_double); long $_Double = Double.doubleToLongBits(this.get_double()); result = result * 59 + (int)($_Double >>> 32 ^ $_Double); Object $_boolean = this.get_Boolean(); result = result * 59 + ($_boolean == null ? 43 : $_boolean.hashCode()); Object $_Boolean = this.get_Boolean(); result = result * 59 + ($_Boolean == null ? 43 : $_Boolean.hashCode()); result = result * 59 + Float.floatToIntBits(this.get_float()); result = result * 59 + Float.floatToIntBits(this.get_float()); Object $myName = this.getMyName(); result = result * 59 + ($myName == null ? 43 : $myName.hashCode()); Object $mYnAmE = this.getMyName(); result = result * 59 + ($mYnAmE == null ? 43 : $mYnAmE.hashCode()); Object $MyNaMe = this.getMyName(); result = result * 59 + ($MyNaMe == null ? 43 : $MyNaMe.hashCode()); Object $my_name = this.getMy_name(); result = result * 59 + ($my_name == null ? 43 : $my_name.hashCode()); return result; } public String toString() { return "TestLombok(_long=" + this.get_long() + ", _Long=" + this.get_long() + ", _byte=" + this.get_byte() + ", _Byte=" + this.get_byte() + ", _double=" + this.get_double() + ", _Double=" + this.get_double() + ", _boolean=" + this.get_Boolean() + ", _Boolean=" + this.get_Boolean() + ", _float=" + this.get_float() + ", _Float=" + this.get_float() + ", myName=" + this.getMyName() + ", mYnAmE=" + this.getMyName() + ", MyNaMe=" + this.getMyName() + ", my_name=" + this.getMy_name() + ")"; } public TestLombok() { } public TestLombok(long _long, Long _Long, byte _byte, Byte _Byte, double _double, Double _Double, boolean _boolean, Boolean _Boolean, float _float, Float _Float, String myName, String mYnAmE, String MyNaMe, String my_name) { this._long = _long; this._Long = _Long; this._byte = _byte; this._Byte = _Byte; this._double = _double; this._Double = _Double; this._boolean = _boolean; this._Boolean = _Boolean; this._float = _float; this._Float = _Float; this.myName = myName; this.mYnAmE = mYnAmE; this.MyNaMe = MyNaMe; this.my_name = my_name; } }
6:结论
6-1:自动生成的Setter/Getter方法少了,貌似属性不区分大小写
6-2:equals方法也是存在问题,某些属性的Getter方法使用错误
鉴于水平有限难保不会出现错漏之处,如果你觉得那里有错误,请点击一下“反对”按钮,并希望您提出宝贵的修改意见,您的宝贵意见将是我们进步的一大源泉!
如果您觉得阅读上文对您有所帮助,请轻点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!