[英]scan .class files or jar file to reflection
在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);
}
}
}
首先,您要達到什么目的?
有一些解決方案,例如使用Guava的classpath掃描程序 。 然后,您可以從該類中找到它的父類是什么以及類型參數是什么。
您可以通過反射獲取泛型類型信息:
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() );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.