【问题标题】:Can a Class in Java determine if it has been modifier?Java中的类可以确定它是否已被修饰符吗?
【发布时间】:2009-09-30 18:23:23
【问题描述】:

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

可能会得到 Client.class 的最后修改日期是解决方案吗?这可能吗?

【问题讨论】:

  • 修改是什么意思?修改它的“内部状态”(实例变量已更改)?还是字节码变了?
  • 您的意思是您在内存中有一个实例,然后您更改了类定义(如何???)并且您希望该实例知道该更改???
  • @pgras:不,类文件可能会在实例化之间发生变化。可能我只需要获取类文件的最后修改日期吗?

标签: java class last-modified


【解决方案1】:

你说的修改是什么意思?比如有什么属性改变了吗?

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

【讨论】:

    【解决方案2】:

    我假设您的意思是以下情况。

    • A1 类关联一个实例:a1
    • Starter 更新 a1 以与 A2 关联(A2 是 A1 的第 2 版)

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

    PS。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-09
      • 2012-04-19
      • 2020-05-12
      • 2011-12-30
      • 2013-08-24
      • 2017-05-17
      • 2013-08-28
      • 1970-01-01
      相关资源
      最近更新 更多