论坛首页 Java企业应用论坛

从代理模式到Java反射机制

浏览 17676 次
精华帖 (2) :: 良好帖 (8) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-01  
我觉得lz的代码没有体现代理模式,lz做的仅仅是提供一个封装类。
0 请登录后投票
   发表时间:2010-04-01  
说到反射机制就头痛,现在还是狠下心来看看,收益不少啊
0 请登录后投票
   发表时间:2010-04-01  
只能说是反射,根本没看到代理模式的任何东西
0 请登录后投票
   发表时间:2010-04-01  
尽管没有很好地说明代理模式,还是感谢楼主分享。使我对java反射机制有了进一步的认识!
0 请登录后投票
   发表时间:2010-04-01  
楼主的文章并没有讲到代理模式,代码很好的说了反射和注解的应用
0 请登录后投票
   发表时间:2010-04-02  

    以子类为参数定义的方法的,谁能告诉我这种情况下该如何解决?


在实际项目中,只能约定熟成了. 比如Spring中的JdbcTemplate。 public List query(String sql, Object[] args, RowMapper rowMapper) throws DataAccessException 方法中rowMapping这种都是interface,在这种大环境下就可以这样。 /** * * 功能说明 : 对Spring JdbcTemplate 的aspect切面 */ @Aspect public class HistoryDataAspect implements Ordered { protected final static Log logger = LogFactory.getLog("aspect:"); @SuppressWarnings("unchecked") @Around("within(cn.huacai.aspect.HistoryJdbcTemplateAdapter)") public Object around(ProceedingJoinPoint pjp) throws Throwable { String sql = null; String argnames = ""; long t1 = 0; Object result = null; String methodName = pjp.getSignature().getName(); Object[] args = pjp.getArgs(); Class[] argsTypes = new Class[args.length]; if (methodName.startsWith("query") && args.length > 0) { // 只对query打头的方法进行特殊处理 sql = (String) args[0]; args[0] = HandlerGetHistoryHolder.getHistorySql(sql); } if (args != null) { for (int i = 0; i clz = args[i].getClass(); if (clz.getName().indexOf("$") == -1 || clz.getInterfaces().length == 0) { argsTypes[i] = clz; argnames += clz + ","; } else { Class>[] inters = clz.getInterfaces(); argsTypes[i] = inters[0]; argnames += inters[0] + ","; } } } HistoryJdbcTemplateAdapter target = (HistoryJdbcTemplateAdapter) pjp.getTarget(); if (logger.isInfoEnabled()) { t1 = System.currentTimeMillis(); } try { Method method = HistoryJdbcTemplateAdapter.adapteeClazz.getDeclaredMethod(methodName, argsTypes); result = method.invoke(target.getJdbcTemplate(), args); } catch (Exception e) { e.printStackTrace(); result = pjp.proceed(); } if (logger.isInfoEnabled()) { if (argnames.length() > 1) argnames = argnames.substring(0, argnames.length() - 1); String logmsg = "=========>JdbcTempate." + methodName + "(" + argnames + ") "; logger.info(logmsg + "执行时间:" + (System.currentTimeMillis() - t1) + "ms."); if (sql != null) logger.info(logmsg + "执行的sql:" + sql); } return result; }
0 请登录后投票
   发表时间:2010-04-02  
这里的反射就是反射,不要与代理扯到一起
0 请登录后投票
   发表时间:2010-04-02  
正要学习反射机制,谢谢楼主分享。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics