我知道可以通过invoke来调用想使用的方法。
我想问一下,可以读取一个正在运行时的类的属性吗?例如hibernate框架,我使用它在进行查找,它执行到了Loader.class的getOptionalObjectKey这个方法。
我可不可以通过反射来获得optionalObject的值?
private static EntityKey getOptionalObjectKey(QueryParameters queryParameters, SessionImplementor session)
    {
        Object optionalObject = queryParameters.getOptionalObject();
        Serializable optionalId = queryParameters.getOptionalId();
        String optionalEntityName = queryParameters.getOptionalEntityName();
        if(optionalObject != null && optionalEntityName != null)
            return new EntityKey(optionalId, session.getEntityPersister(optionalEntityName, optionalObject), session.getEntityMode());
        else
            return null;
    }

解决方案 »

  1.   

    值的话,貌似只能通过调用getter获取。。
      

  2.   

    嗯 ,因为框架内容不能修改,不能加get set所以才出来问问的哈。好奇这个想法
      

  3.   

    如果你这样都行,那set/get就没存在的意义了哦。
      

  4.   

    方法都没执行完成,你就算能得到那也只是中间数据,其实没有太大意义不是?
    就如你上面那个方法一样,在return的时候才构造的EntityKey这个对象,那么之前EntityKey也都是null。获取来能有什么意义呢?
      

  5.   

    说是这样说,不过这样可以监测到一些有用的信息。
    例如这篇文章:
    “想看Hibernate生成的SQL语句?” 
    http://rmn190.iteye.com/blog/254885
    中的这段代码
    protected final PreparedStatement prepareQueryStatement(QueryParameters queryParameters, boolean scroll, SessionImplementor session)
            throws SQLException, HibernateException
        {
            queryParameters.processFilters(getSQLString(), session);
            String sql = queryParameters.getFilteredSQL();
            Dialect dialect = getFactory().getDialect();
            RowSelection selection = queryParameters.getRowSelection();
            boolean useLimit = useLimit(selection, dialect);
            boolean hasFirstRow = getFirstRow(selection) > 0;
            boolean useOffset = hasFirstRow && useLimit && dialect.supportsLimitOffset();
            boolean callable = queryParameters.isCallable();
            boolean useScrollableResultSetToSkip = hasFirstRow && !useOffset && getFactory().getSettings().isScrollableResultSetsEnabled();
            ScrollMode scrollMode = scroll ? queryParameters.getScrollMode() : ScrollMode.SCROLL_INSENSITIVE;
            if(useLimit)
                sql = dialect.getLimitString(sql.trim(), useOffset ? getFirstRow(selection) : 0, getMaxOrLimit(selection, dialect));
            sql = preprocessSQL(sql, queryParameters, dialect);
            PreparedStatement st = null;
            if(callable)
                st = session.getBatcher().prepareCallableQueryStatement(sql, scroll || useScrollableResultSetToSkip, scrollMode);
            else
                st = session.getBatcher().prepareQueryStatement(sql, scroll || useScrollableResultSetToSkip, scrollMode);
            try
    他说的好像就是利用断点来监测数据,不过我设置了断点到那的时候没有数据。显示 sql cannot be resolved。
    只是好奇这种方法。虽然得到的仍然不是原版的sql语句,不过我觉得这种方法很好用。