我有一个 Starter.class,它在需要时更新一些类,然后实例化并运行一个 Client 类。
Class 的实例是否有可能(如果是,如何)知道自上次调用以来它是否已被修改?修改只是一个小修改,大多数方法保持不变。
可能获得 Client.class 的最后修改日期是解决方案吗?那可能吗?
我有一个 Starter.class,它在需要时更新一些类,然后实例化并运行一个 Client 类。
Class 的实例是否有可能(如果是,如何)知道自上次调用以来它是否已被修改?修改只是一个小修改,大多数方法保持不变。
可能获得 Client.class 的最后修改日期是解决方案吗?那可能吗?
你说的修改是什么意思?就像有任何属性改变了吗?
我以前做过的一种可能的方法是使用序列化 API 创建对象的深层克隆。
即:创建一个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);
}
我假设您的意思是以下情况。
为了做到这一点,你不是已经有一个特殊的类加载器了吗?如果创建特殊的类加载器,为什么不能使用类加载器来跟踪上次修改时间?您是否使用 OSGi 来处理这个问题?
PS。
@Burkhard,如果可以在实例化之间更改类文件,那么框架中的类加载器可能会为您完成这项工作。默认类加载器不会重新加载类。一种解决方案是扩展 ClassLoader.loadClass(String) 方法,以便在调用 super.loadClass(String) 后也记录上次更新时间。当然,您必须在框架中覆盖您的自定义类加载器(大多数开源框架都支持它)。但是,我不建议定期序列化类对象以计算它已更改然后记录时间之类的技巧。它的价格昂贵