是否可以在运行时从Java对象中删除属性?

时间:2019-05-31 08:23:02

标签: java reflection

我有一个带有jpa注释的pojo。字符串属性之一被标记为不可为空。下游有一些代码可以设置该值(如果未设置)。在某些情况下,需要触发此代码,但是如果将值设置为空字符串,则会将其作为值执行,并且不会触发。我不能将非null值设置为null,因此无法编辑该对象以传统方式触发代码。

说实话,这部分代码还是需要重构的,我确实有解决方法,但是我敢肯定,我已经找到了一种方法来“删除”以前的某个地方的性能(也许是反思?)

所以类看起来像这样...

@Entity
@Table(name="Example")
@SequenceGenerator(name = "seq1", sequenceName = "seq1")
public class Example implements Serializable {

    @Column(name="name", nullable=true, length = 100)
    private java.lang.String name;

    @Column(name="id", nullable=false)      @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ1_Type_SEQ")
    @Id
    private long oID;

    @Column(name="extraval", nullable=false, length = 100)
    private java.lang.String entityVersion;4

...

如果没有在pojo中设置,则ExtraVal将通过各种jpa / db约束进行设置。有时,即使已经设置了它,我也想触发它,但是将值设置为空字符串会将其设置为值,将值设置为null会触发错误。

我实际上可以预先模拟该值,并且希望在某个时候重构代码,这样我可以在创建对象之前进行所有检查,从而避免复制/重新创建对象等等。就像我说的那样,我敢肯定有一种优雅的方法可以将物业作为短期解决方案删除?

1 个答案:

答案 0 :(得分:0)

  

我只是确定有一种优雅的方法来删除该属性,并将其作为短期解决方案?

没有。不能使用反射来修改类。

从理论上讲,可以在加载编译的类之前或同时对其进行修改。但是,您的JPA框架的注释处理器可能已经在这样做了。所以我认为这不切实际。 (更不用说了!)