扫描.class文件或jar文件到反射

时间:2015-01-13 14:49:46

标签: java generics reflection jar

在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);
                }
            }
        }

2 个答案:

答案 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() );
    }