2009-09-30 100 views
1

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

可能是最后一次修改Client.class的日期是否是解决方案?那可能吗?

+2

修饰是什么意思?修改它的“内部状态”(实例变量已更改)?或者它的字节码已经改变了? – 2009-09-30 18:27:50

+0

其字节码已更改。 – Burkhard 2009-09-30 20:11:13

+0

你的意思是你在内存中有一个实例,然后你改变类的定义(如何?),你希望实例知道这个改变? – pgras 2009-10-01 07:56:28

回答

2

我想你指的是以下情况。

  • A1类相关联的实例:A1
  • 入门更新A1与A2到assoicate(A2是A1的第2版)

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

PS。

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

+0

我没有创建类加载器,也没有创建更新方法。 – Burkhard 2009-10-01 12:28:58

3

你是什么意思修改?如有任何属性更改?

我之前完成的一种方法是使用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); 
} 
相关问题