Java:更改堆上的对象引用?

Java:更改堆上的对象引用?,java,reference,heap,Java,Reference,Heap,想知道是否有办法更改堆上其他对象正在引用的对象 我特别想做的是管理我的瞬态配置。我正在做的是从JAXB或JPA加载“绑定”配置。我有一个管理器,它维护一些线程来检查那些配置存储是否更改。如果他们这样做了,我希望再次从存储中加载配置(创建配置的新实例),并用堆上的新实例替换“过时”配置实例,这样引用配置数据的任何对象都将获得最新的配置实例 我知道我可能会因为必须处理分层对象引用而陷入噩梦——但我只是想了解各种可能的方法,然后才决定简单地记录不创建本地引用,并始终从配置管理器调用(如果您期望最新的=

想知道是否有办法更改堆上其他对象正在引用的对象

我特别想做的是管理我的瞬态配置。我正在做的是从JAXB或JPA加载“绑定”配置。我有一个管理器,它维护一些线程来检查那些配置存储是否更改。如果他们这样做了,我希望再次从存储中加载配置(创建配置的新实例),并用堆上的新实例替换“过时”配置实例,这样引用配置数据的任何对象都将获得最新的配置实例

我知道我可能会因为必须处理分层对象引用而陷入噩梦——但我只是想了解各种可能的方法,然后才决定简单地记录不创建本地引用,并始终从配置管理器调用(如果您期望最新的=)

有什么办法吗?我对AOP不太熟悉……但据我所知……我认为这可能是实现这一目标的一条途径

当然,欢迎提出任何其他想法=)


Steve

我对JAXB或JPA一无所知,但下面是我要做的。为各种对象提供对配置包装器的引用。然后,您可以更新配置(以同步方式),而无需更改这些引用:

interface Config { String getSomeProperty(); }

class ConcreteConfig implements Config{
    public String getSomeProperty() {
        return "some value";
    }
}

class ConfigWrapper implements Config {
    private Config backing;
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    public void setBacking(ConfigBacking backing) {
        try {
            lock.writeLock().lock();
            this.backing = backing;
        } finally {
            lock.writeLock().unlock();
        }
    }

    @Override
    public String getSomeProperty() {
        try {
            lock.readLock().lock();
            return backing.getSomeProperty();
        } finally {
            lock.readLock().unlock();
        }
    }
}

然后,您将只分发ConfigWrapper的实例,并且可以随时自由地重新分配支持对象。

我对JAXB或JPA一无所知,但下面是我要做的。为各种对象提供对配置包装器的引用。然后,您可以更新配置(以同步方式),而无需更改这些引用:

interface Config { String getSomeProperty(); }

class ConcreteConfig implements Config{
    public String getSomeProperty() {
        return "some value";
    }
}

class ConfigWrapper implements Config {
    private Config backing;
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    public void setBacking(ConfigBacking backing) {
        try {
            lock.writeLock().lock();
            this.backing = backing;
        } finally {
            lock.writeLock().unlock();
        }
    }

    @Override
    public String getSomeProperty() {
        try {
            lock.readLock().lock();
            return backing.getSomeProperty();
        } finally {
            lock.readLock().unlock();
        }
    }
}

然后,您将只分发ConfigWrapper的实例,并且可以随时自由地重新分配备份对象。

您可以查看。如果我的记忆有用的话,它支持类似的东西(可能?)。

你可以查看。如果我的记忆力好的话,它支持类似的东西(也许?)

+1马克击败了我,但我也会这样做。与本例中的简单包装器对象相比,AOP可能有些过分。谢谢Mark。我想到了这一点,但问题是JAXB/JPA绑定的对象。这些将创建一个分层对象结构,支持继承和聚合。虽然“清除”一个集合,而不是抽象地重新添加项目并不难……但我想找到一个更优雅的解决方案。我还考虑了处理schronization的锁定,但我担心那些可能相关的配置,但不在同一个对象中,更不用说同一个getter/setter了。在这种情况下,它几乎需要一笔交易。+1马克击败了我,但我也会这样做。与本例中的简单包装器对象相比,AOP可能有些过分。谢谢Mark。我想到了这一点,但问题是JAXB/JPA绑定的对象。这些将创建一个分层对象结构,支持继承和聚合。虽然“清除”一个集合,而不是抽象地重新添加项目并不难……但我想找到一个更优雅的解决方案。我还考虑了处理schronization的锁定,但我担心那些可能相关的配置,但不在同一个对象中,更不用说同一个getter/setter了。在这种情况下,它几乎需要一个事务。@LBT First-awesome name=)其次,我没有。我将使用这个管理器作为OSGi服务/捆绑包,并在标准SE和EJB容器中使用它。实际上,这最终将成为我自己的“分布式应用程序”容器服务的一部分——我将看一看Spring,如果他们这样做了,看看他们是如何做到的……但我当然不想依赖Spring。谢谢你的提示@LBT First-awesome name=)其次,我没有。我将使用这个管理器作为OSGi服务/捆绑包,并在标准SE和EJB容器中使用它。实际上,这最终将成为我自己的“分布式应用程序”容器服务的一部分——我将看一看Spring,如果他们这样做了,看看他们是如何做到的……但我当然不想依赖Spring。谢谢你的提示!!