springside提供的一个GenericsUtils的泛型工具类,不知道对已高并发的系统,用他来转换效率如何,有替代方案吗?
我的Struts2 Action 类必须继承GenericAction(自写),强制泛型传入,
如下
public class UserAction extends GenericAction<UserForm> {
页面获取 current即可
}T current = (Class<T>) GenericsUtils.getSuperClassGenricType(getClass()).newInstance();public class GenericsUtils {
private static final Logger log = Logger.getLogger(GenericsUtils.class); private GenericsUtils() {
} /**
* 通过反射,获得定义Class时声明的父类的范型参数的类型.
*
* @param clazz The class to introspect
* @return the first generic declaration, or <code>Object.class</code> if cannot be determined
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(Class clazz) {
return getSuperClassGenricType(clazz, 0);
} /**
* 通过反射,获得定义Class时声明的父类的范型参数的类型,如没有找到符合要求的范型参数,则递归向上直到Object.
*
* @param clazz 需要反射的类,该类必须继承范型父类.
* @param index 泛型参数所在索引,从0开始.
* @return 范型参数的实际类型,如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回.
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(Class clazz, int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) {
log.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
return Object.class;
} Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) {
log.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
+ params.length);
return Object.class;
}
if (!(params[index] instanceof Class)) {
log.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
return Object.class;
}
return (Class) params[index];
}
}
我的Struts2 Action 类必须继承GenericAction(自写),强制泛型传入,
如下
public class UserAction extends GenericAction<UserForm> {
页面获取 current即可
}T current = (Class<T>) GenericsUtils.getSuperClassGenricType(getClass()).newInstance();public class GenericsUtils {
private static final Logger log = Logger.getLogger(GenericsUtils.class); private GenericsUtils() {
} /**
* 通过反射,获得定义Class时声明的父类的范型参数的类型.
*
* @param clazz The class to introspect
* @return the first generic declaration, or <code>Object.class</code> if cannot be determined
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(Class clazz) {
return getSuperClassGenricType(clazz, 0);
} /**
* 通过反射,获得定义Class时声明的父类的范型参数的类型,如没有找到符合要求的范型参数,则递归向上直到Object.
*
* @param clazz 需要反射的类,该类必须继承范型父类.
* @param index 泛型参数所在索引,从0开始.
* @return 范型参数的实际类型,如果没有实现ParameterizedType接口,即不支持泛型,所以直接返回.
*/
@SuppressWarnings("unchecked")
public static Class getSuperClassGenricType(Class clazz, int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) {
log.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType");
return Object.class;
} Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) {
log.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
+ params.length);
return Object.class;
}
if (!(params[index] instanceof Class)) {
log.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
return Object.class;
}
return (Class) params[index];
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货