Java中的类能否确定它是否已被修改?
我有一个Starter.class,它在需要时更新一些类,然后实例化并运行一个客户机类。Java中的类能否确定它是否已被修改?,java,class,last-modified,Java,Class,Last Modified,我有一个Starter.class,它在需要时更新一些类,然后实例化并运行一个客户机类。 类的实例是否可能(如果是,如何)知道自上次调用以来它是否已被修改?修改只是一个小改动,大多数方法保持不变 可能正在获取上次修改客户端的日期。类是解决方案吗?这可能吗?你所说的修改是什么意思?如中所示,有任何属性更改吗 我以前做过的一种可能的方法是使用序列化API创建对象的深层克隆 ie:创建ObjectOutputStream,并将该对象写入ByteArrayOutputStream。现在,您有了一组字节,
类的实例是否可能(如果是,如何)知道自上次调用以来它是否已被修改?修改只是一个小改动,大多数方法保持不变
可能正在获取上次修改客户端的日期。类是解决方案吗?这可能吗?你所说的修改是什么意思?如中所示,有任何属性更改吗 我以前做过的一种可能的方法是使用序列化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版)
@Burkhard,如果类文件可以在实例化之间更改,那么框架中的类加载器可能会为您完成这项工作。默认类加载器不重新加载类。一种解决方案是扩展ClassLoader.loadClass(String)方法,以记录调用super.loadClass(String)后的上次更新时间。当然,您必须重写框架中的自定义类加载器(大多数开源框架都支持它)。然而,我不建议做像定期序列化类对象这样的把戏,以判断它是否被更改,然后记录时间。它很贵我想你指的是以下情况
- 类A1关联一个实例:A1
- Starter将a1更新为与A2关联(A2是a1的第2版)
@Burkhard,如果类文件可以在实例化之间更改,那么框架中的类加载器可能会为您完成这项工作。默认类加载器不重新加载类。一种解决方案是扩展ClassLoader.loadClass(String)方法,以记录调用super.loadClass(String)后的上次更新时间。当然,您必须重写框架中的自定义类加载器(大多数开源框架都支持它)。然而,我不建议做像定期序列化类对象这样的把戏,以判断它是否被更改,然后记录时间。它很贵修改意味着什么?修改了它的“内部状态”(实例变量已更改)?或者它的字节码已经改变了?你的意思是你在内存中有一个实例,然后你改变了类定义(如何?),你想让实例知道这个改变???@pgras:不,类文件可能会在不同的实例之间改变。可能我只需要得到上次修改类文件的日期?修改意味着什么?修改了它的“内部状态”(实例变量已更改)?或者它的字节码已经改变了?你的意思是你在内存中有一个实例,然后你改变了类定义(如何?),你想让实例知道这个改变???@pgras:不,类文件可能会在不同的实例之间改变。也许我只需要得到上次修改类文件的日期?