扫描 .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() );
    }