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