即使对象没有默认构造函数,也能方便创建成功。
import com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;
import org.joor.Reflect;
import org.objenesis.Objenesis;
import org.objenesis.ObjenesisStd;
public class FinalClassCreate {
@ToString @AllArgsConstructor
public static class FinalBean {
@Getter private final String name;
}
public static void main(String[] args) {
Objenesis objenesis = new ObjenesisStd();
FinalBean o = objenesis.newInstance(FinalBean.class); // 能成功创建
Reflect.on(o).set("name", "bingoo");
System.out.println(o);
// 异常:com.alibaba.fastjson.JSONException: default constructor not found. class org.n3r.sandbox.objenesis.FinalClassCreate$FinalBean
FinalBean finalBean = JSON.parseObject("{name:\"dingoo\"}", FinalBean.class);
System.out.println(finalBean);
}
}
4条答案
按热度按时间l5tcr1uw1#
为什么有这种需求?能说说你场景么?
o3imoua42#
本意是期望能创建一个Immutable Bean,一旦创建,不希望属性被修改,多线程保持安全。
ep6jt1vc3#
如果全都要默认构造函数,objenesis这个类库的应用场景也就消失了啊
wmomyfyw4#
已经支持非默认构造函数,请使用新版本
https://github.com/alibaba/fastjson/releases/tag/1.2.36