Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的类能否确定它是否已被修改?_Java_Class_Last Modified - Fatal编程技术网

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

Java中的类能否确定它是否已被修改?,java,class,last-modified,Java,Class,Last Modified,我有一个Starter.class,它在需要时更新一些类,然后实例化并运行一个客户机类。 类的实例是否可能(如果是,如何)知道自上次调用以来它是否已被修改?修改只是一个小改动,大多数方法保持不变 可能正在获取上次修改客户端的日期。类是解决方案吗?这可能吗?你所说的修改是什么意思?如中所示,有任何属性更改吗 我以前做过的一种可能的方法是使用序列化API创建对象的深层克隆 ie:创建ObjectOutputStream,并将该对象写入ByteArrayOutputStream。现在,您有了一组字节,

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


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

你所说的修改是什么意思?如中所示,有任何属性更改吗

我以前做过的一种可能的方法是使用序列化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);
}

你说的修改是什么意思?如中所示,有任何属性更改吗

我以前做过的一种可能的方法是使用序列化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);
}

我想你指的是以下情况

  • 类A1关联一个实例:A1
  • Starter将a1更新为与A2关联(A2是a1的第2版)
为了做到这一点,您是否已经有了一个特殊的类加载器?如果创建特殊类加载器,为什么不能使用类加载器跟踪上次修改的时间?你在用OSGi来处理这个问题吗

附言


@Burkhard,如果类文件可以在实例化之间更改,那么框架中的类加载器可能会为您完成这项工作。默认类加载器不重新加载类。一种解决方案是扩展ClassLoader.loadClass(String)方法,以记录调用super.loadClass(String)后的上次更新时间。当然,您必须重写框架中的自定义类加载器(大多数开源框架都支持它)。然而,我不建议做像定期序列化类对象这样的把戏,以判断它是否被更改,然后记录时间。它很贵

我想你指的是以下情况

  • 类A1关联一个实例:A1
  • Starter将a1更新为与A2关联(A2是a1的第2版)
为了做到这一点,您是否已经有了一个特殊的类加载器?如果创建特殊类加载器,为什么不能使用类加载器跟踪上次修改的时间?你在用OSGi来处理这个问题吗

附言


@Burkhard,如果类文件可以在实例化之间更改,那么框架中的类加载器可能会为您完成这项工作。默认类加载器不重新加载类。一种解决方案是扩展ClassLoader.loadClass(String)方法,以记录调用super.loadClass(String)后的上次更新时间。当然,您必须重写框架中的自定义类加载器(大多数开源框架都支持它)。然而,我不建议做像定期序列化类对象这样的把戏,以判断它是否被更改,然后记录时间。它很贵

修改意味着什么?修改了它的“内部状态”(实例变量已更改)?或者它的字节码已经改变了?你的意思是你在内存中有一个实例,然后你改变了类定义(如何?),你想让实例知道这个改变???@pgras:不,类文件可能会在不同的实例之间改变。可能我只需要得到上次修改类文件的日期?修改意味着什么?修改了它的“内部状态”(实例变量已更改)?或者它的字节码已经改变了?你的意思是你在内存中有一个实例,然后你改变了类定义(如何?),你想让实例知道这个改变???@pgras:不,类文件可能会在不同的实例之间改变。也许我只需要得到上次修改类文件的日期?