Java中的类可以确定它是否已经是修饰符?

时间:2009-09-30 18:23:23

标签: java class last-modified

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

可能是获得Client.class上次修改的日期是解决方案吗?这可能吗?

2 个答案:

答案 0 :(得分:3)

你修改后的意思是什么?如果有任何属性改变了吗?

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

答案 1 :(得分:2)

我认为你的意思是以下情况。

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

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

PS。

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