有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的类能否确定它是否已被修改?

我有,一个开胃菜。类,该类在需要时更新某些类,然后实例化并运行客户端类
类的实例是否可能(如果是,如何)知道自上次调用以来它是否已被修改?修改只是一个小改动,大多数方法保持不变

可能正在获取上次修改客户端的日期。课堂是解决方案吗?可能吗


共 (2) 个答案

  1. # 1 楼答案

    你说的修改是什么意思?比如说,有什么财产改变了吗

    我以前做过的一种可能的方法是使用序列化API创建对象的深度克隆

    ie:创建一个ObjectOutputStream,并将该对象写入ByteArrayOutputStream。现在,您有了一组字节,它们是给定时间点上对象的序列化版本

    当你想知道它是否改变了,你可以做同样的事情,比较两个字节的数组

    这方面的潜在问题是:
    1) 对象需要可序列化
    2) 如果对象有另一个对象作为属性,并且该对象发生了更改,则父对象也将被视为已更改。(不过,这可能是需要的。)

    以下是一些代码:

    private static byte[] getObjectBytes(Object object) throws IOException {
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      new ObjectOutputStream (output).writeObject( object );
      output.flush();
      return output.toByteArray();
    }
    
    // These go in the object
    private byte[] digest;
    public void mark() {
      digest = getObjectBytes(this);
    }
    
    public boolean hasChanged() {
      return !Arrays.equals(getObjectBytes(this), digest);
    }
    
  2. # 2 楼答案

    我猜你指的是以下情况

    • 类A1关联一个实例:A1
    • Starter将a1更新为与A2关联(A2是a1的版本2)

    为了做到这一点,你不是已经有了一个特殊的类加载器吗?如果您创建了特殊类加载器,为什么不能使用类加载器来跟踪上次修改的时间?你是在用OSGi来处理这个问题吗

    附言

    @Burkhard,如果类文件可以在实例化之间更改,那么框架中的类加载器很可能会帮你完成这项工作。默认类加载器不会重新加载类。一个解决方案是扩展这个类加载器。loadClass(String)方法也记录调用super后最后更新的时间。loadClass(字符串)。当然,您必须覆盖框架中的自定义类加载器(大多数开源框架都支持它)。然而,我不建议做一些技巧,比如周期性地序列化类对象来判断它是否被更改,然后记录时间。很贵