簡體   English   中英

掃描.class文件或jar文件進行反射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM