Java - 获取封闭实例

时间:2017-03-13 15:40:42

标签: 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(),由外部类使用反射????

1 个答案:

答案 0 :(得分:0)

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

如果AbstractReportWork没有嵌套在ReportManagementDAOImpl内,那么您尝试做的就是(尽管可能)一个可怕的想法,因为您正在引入一个隐藏的(并且非常不寻常)要求AbstractReportWork的继承者必须是嵌套类。这不过是一块地雷,所以不要这样做。

以下是更好的选择:

  1. 如果可能的话(即,如果它是无状态的),@Autowire SessionFactory进入你需要它的类(而不是从外部类中获取它,或者从任何地方手动获取它)< / LI>
  2. 否则,如果需要,可以将ReportManagementDAOSessionFactory的实例传递给ReportWork(可能通过doReport()接受它:doReport(SessionFactory sessFactory){...}或制作构造函数接受它:ReportWork(SessionFactory sessFactory) {...}
  3. 如果你真的想看世界燃烧,反思地得到封闭的实例:

    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版本中破解的黑客攻击,因为this$0字段绝不是所记录的API的一部分。