我有这堂课:
@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(),由外部类使用反射????
答案 0 :(得分:0)
如果AbstractReportWork
也嵌套在ReportManagementDAOImpl
内且不是static
,则可以通过ReportManagementDAOImpl.this
获取当前外部实例。
如果AbstractReportWork
没有嵌套在ReportManagementDAOImpl
内,那么您尝试做的就是(尽管可能)一个可怕的想法,因为您正在引入一个隐藏的(并且非常不寻常)要求AbstractReportWork
的继承者必须是嵌套类。这不过是一块地雷,所以不要这样做。
以下是更好的选择:
@Autowire SessionFactory
进入你需要它的类(而不是从外部类中获取它,或者从任何地方手动获取它)< / LI>
ReportManagementDAO
或SessionFactory
的实例传递给ReportWork
(可能通过doReport()
接受它:doReport(SessionFactory sessFactory){...}
或制作构造函数接受它:ReportWork(SessionFactory sessFactory) {...}
)如果你真的想看世界燃烧,反思地得到封闭的实例:
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的一部分。