锁定老帖子 主题:从代理模式到Java反射机制
精华帖 (2) :: 良好帖 (8) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-01
我觉得lz的代码没有体现代理模式,lz做的仅仅是提供一个封装类。
|
|
返回顶楼 | |
发表时间:2010-04-01
说到反射机制就头痛,现在还是狠下心来看看,收益不少啊
|
|
返回顶楼 | |
发表时间:2010-04-01
只能说是反射,根本没看到代理模式的任何东西
|
|
返回顶楼 | |
发表时间:2010-04-01
尽管没有很好地说明代理模式,还是感谢楼主分享。使我对java反射机制有了进一步的认识!
|
|
返回顶楼 | |
发表时间:2010-04-01
楼主的文章并没有讲到代理模式,代码很好的说了反射和注解的应用
|
|
返回顶楼 | |
发表时间: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;
}
|
|
返回顶楼 | |
发表时间:2010-04-02
这里的反射就是反射,不要与代理扯到一起
|
|
返回顶楼 | |
发表时间:2010-04-02
正要学习反射机制,谢谢楼主分享。
|
|
返回顶楼 | |