Java - 获取封闭实例

标签 java hibernate reflection inner-classes

我有这门课:

@Transactional
@Repository("reportManagementDAO")
public class ReportManagementDAOImpl implements ReportManagementDAO,
        Serializable{
@Autowired
private SessionFactory getSessionFactory;

public SessionFactory getSessionFactory(){
   return sessionFactory;
}

public void setSessionFactory(SessionFactory sessionFactory){
  this.sessionFactory = sessionFactory;
}

 class ReportWork extends AbstractReportWork{

 }
}//

abstract class AbstractReportWork extends RCDStoreProcedureWork {

   void doReport() {
     //How can I access to: ReportManagementDAOImpl.getSessionFactory()
     //using reflection, for example: 
     //Class<?> type = getClass().getEnclosingClass();
   }
}

如何使用反射通过外部类访问:ReportManagementDAOImpl.getSessionFactory()???

最佳答案

如果AbstractReportWork也嵌套在 ReportManagementDAOImpl 内不是 static ,你可以通过 ReportManagementDAOImpl.this 获取当前的外部实例.

如果AbstractReportWork未嵌套在 ReportManagementDAOImpl 内,你想要做的(虽然可能)是一个糟糕的主意,因为你引入了一个隐藏的(而且极其不寻常的)要求,即 AbstractReportWork 的继承者必须是嵌套类。这无异于地雷,所以不要这样做。

这里有更好的选择:

  1. 如果可能(即如果都是无状态的),@Autowire SessionFactory进入您需要它的类(而不是从外部类获取它,或者从任何地方手动获取它)
  2. 否则,传递 ReportManagementDAO 的实例或SessionFactoryReportWork如果需要(可能通过使 doReport() 接受它: doReport(SessionFactory sessFactory){...} 或通过使构造函数接受它: ReportWork(SessionFactory sessFactory) {...} )

如果您真的想观看世界燃烧,请反射(reflection)地获取封闭的实例:

Field this$0 = this.getClass().getDeclaredField("this$0");
//not sure if this$0.setAccessible(true); is required
ReportManagementDAO enclosing = (ReportManagementDAO) this$0.get(this);
enclosing.getSessionFactory();

但请注意,这是一个可能会在未来的 Java 版本中被破坏的 hack,因为 this$0字段绝不是记录的 API 的一部分。

关于Java - 获取封闭实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767714/

相关文章:

java - 使用 Oracle 在 Hibernate 中插入多对一行时出现问题

c# - 数据访问层的反射性能

c# - 我在 Reflection.Emit.DynamicMethod 中发出的 IL 有什么问题?

java - 在单节点群集上使用分布式缓存和FileReader

Java BigInteger.and 不适用于大数字?

java - 为什么Tomcat/JSP看不到这些类?

c++ - 我可以告诉我的类是从哪个模板实例类继承的吗?

java - 当一个类改变时我需要编译哪些类?

java - 如何解决 tomcat 的问题? Spring 启动 "Failed to scan"

java - 无法连接到sql server 2008实例