扫描 .class 个文件或 jar 文件到反射
scan .class files or jar file to reflection
在java项目中,我定义了一个泛型class
public class Test<T>
还有一个子class
public class SubClass extends Test<Person>
我的问题是如何扫码找出哪个class继承自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);
}
}
}
首先,你想用这个实现什么?
对此有一些解决方案,例如使用Guava's classpath scanner;然后你可以从 class 中找到它的父 class 是什么以及类型参数是什么。
可以通过反射获取泛型类型信息:
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() );
}
在java项目中,我定义了一个泛型class
public class Test<T>
还有一个子class
public class SubClass extends Test<Person>
我的问题是如何扫码找出哪个class继承自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);
}
}
}
首先,你想用这个实现什么?
对此有一些解决方案,例如使用Guava's classpath scanner;然后你可以从 class 中找到它的父 class 是什么以及类型参数是什么。
可以通过反射获取泛型类型信息:
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() );
}