我有一个Starter.class,它在需要时更新一些类,然后实例化并运行一个Client类。
Class的实例有可能(如果是的话)如何知道自上次调用以来它是否被修改过?修改只是次要的,大多数方法保持一致。Java中的类可以确定它是否是修饰符?
可能是最后一次修改Client.class的日期是否是解决方案?那可能吗?
我有一个Starter.class,它在需要时更新一些类,然后实例化并运行一个Client类。
Class的实例有可能(如果是的话)如何知道自上次调用以来它是否被修改过?修改只是次要的,大多数方法保持一致。Java中的类可以确定它是否是修饰符?
可能是最后一次修改Client.class的日期是否是解决方案?那可能吗?
我想你指的是以下情况。
为了做到这一点,你不已经有一个特殊类装载机?如果您创建特殊的类加载器,为什么不能使用类加载器来跟踪上次修改的时间?你使用OSGi来处理这个问题吗?
PS。
@Burkhard,如果可以在实例化之间更改类文件,那么框架中的类加载器可能会为您完成这项工作。默认的类加载器不会重载类。一种解决方案是扩展该ClassLoader.loadClass(String)方法,以便在调用super.loadClass(String)之后记录上次更新的时间。当然,你必须在框架中覆盖你的自定义类加载器(大多数开源框架支持它)。但是,我不会建议像定期序列化类对象那样去欺骗它,以便改变它的数字,然后记录时间。它很贵
我没有创建类加载器,也没有创建更新方法。 – Burkhard 2009-10-01 12:28:58
你是什么意思修改?如有任何属性更改?
我之前完成的一种方法是使用Serialization API创建对象的深层克隆。
ie:创建一个ObjectOutputStream,并将该对象写入一个ByteArrayOutputStream。现在,您有一组字节,它是给定时间点上对象的序列化版本。
当你想看看它是否发生了变化,你可以做同样的事情,并比较两个字节数组。
与此potentional问题是:
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);
}
修饰是什么意思?修改它的“内部状态”(实例变量已更改)?或者它的字节码已经改变了? – 2009-09-30 18:27:50
其字节码已更改。 – Burkhard 2009-09-30 20:11:13
你的意思是你在内存中有一个实例,然后你改变类的定义(如何?),你希望实例知道这个改变? – pgras 2009-10-01 07:56:28