在java项目中,我定义了一个泛型类
public class Test<T>
和子类
public class SubClass extends Test<Person>
我的问题是如何扫描代码以找出从Test继承的类,以及类型T.据我所知,类型T将在运行时被删除。
我们可以在.net中执行的任何方法(代码如下)?
public static void RegisterVadas(Container container, params Assembly[] assemblies)
{
assemblies = assemblies.Distinct().ToArray();
foreach (var assembly in assemblies)
{
foreach (var vada in assembly.GetTypes()
.Where(t => t.IsOrHasGenericInterfaceTypeOf(typeof(IVada<>))))
{
RegisterVada(container, vada);
}
}
}
答案 0 :(得分:0)
首先,你想用这个来实现什么?
有一些解决方案,例如使用Guava's classpath scanner;然后,您可以从班级中找到它的父类是什么以及类型参数是什么。
答案 1 :(得分:0)
您可以通过反射获取泛型类型信息:
ParameterizedType superType = (ParameterizedType) SubClass.class.getGenericSuperclass();
该方法允许您通过索引访问类型参数。 Test
只有一个类型参数,因此您需要index == 0
。
/** Get the actual type argument used for a single generic placeholder */
public <T> Class<T> getGenericType( int index ) {
Object typeArg = superType.getActualTypeArguments()[ index ];
if( typeArg instanceof Class ) {
@SuppressWarnings( JavacWarnings.UNCHECKED )
Class<T> result = (Class<T>) typeArg;
return result;
}
if( typeArg instanceof ParameterizedType ) {
ParameterizedType pt = (ParameterizedType) typeArg;
@SuppressWarnings( JavacWarnings.UNCHECKED )
Class<T> result = (Class<T>) pt.getRawType();
return result;
}
throw new RuntimeException( "Unsupported type: " + typeArg.getClass() );
}