在我们的dao框架设计中,sqlDao作为cacheDao的一个泛型参数,由于sqlDao和cacheDao实现了相同的接口,意味着他们有相同的方法和相同的参数,这样我们可以在cacheDao方法中利用反射方便的调用sqlDao中的方法,我们只需要获取aop中保存的方法信息然后调用即可。
protected Long[] getIdsFromTarget() {
Long[] var3;
try {
Method method = this.getCurrentMethod().getMethod();
method = ((CommonObjectDao)this.getTarget()).getClass().getMethod(method.getName(), method.getParameterTypes());
this.setListOrIds(2);
List<DomainObject> idObjects = (List)method.invoke(this.getTarget(), this.getCurrentMethodArguments());
var3 = this.getIdsFromList(idObjects);
} catch (Exception var7) {
throw new RuntimeException(this.getCurrentMethodName(), var7);
} finally {
this.setListOrIds(1);
}
return var3;
}
通过ParameterizedType的方法getActualTypeArguments,获取对应的实例化泛型参数信息。
public ObjectConfig getObjectConfig() {
if (this.objectConfig == null) {
if (this.getTarget() != null) {
this.objectConfig = ((ObjectConfigInside)this.getTarget()).getObjectConfig();
} else {
Type domainType = ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
this.objectConfig = new ObjectConfig((Class)domainType);
}
}
return this.objectConfig;
}