精华内容
下载资源
问答
  • 我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息。使用方法如下:Reflections reflections = new ...

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息。使用方法如下:

    Reflections reflections = new Reflections("my.project");

    Set> subTypes = reflections.getSubTypesOf(SomeType.class);

    下面实例来说明如何使用的:

    定义接口:

    packagetest.reflection;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:16

    *@version1.0.0*/

    public interfaceBase {voiddoSomeThing();

    }

    定义子类1:

    packagetest.reflection;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:18

    *@version1.0.0*/

    public class SubClass1 implementsBase{

    @Overridepublic voiddoSomeThing() {

    System.out.println("SubClass1");

    }

    }

    定义子类2:

    packagetest.reflection;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:18

    *@version1.0.0*/

    public class SubClass2 implementsBase{

    @Overridepublic voiddoSomeThing() {

    System.out.println("SubClass2");

    }

    }

    测试获取所有Base的子类信息:

    packagetest.reflection;importorg.reflections.Reflections;importjava.util.Set;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:19

    *@version1.0.0*/

    public classTest {public static voidmain(String[] args){

    Reflections reflections= new Reflections("test.reflection");

    Setextends Base>> subTypes = reflections.getSubTypesOf(Base.class);

    subTypes.forEach(x->System.out.println(x));

    }

    }

    结果输出如下:

    class test.reflection.SubClass1

    class test.reflection.SubClass2

    如上如何获取所有子类信息。

    其实Reflections还有其他很有用的功能,如下了解下:

    一. Reflections的其他用法

    使用默认的scanners,浏览url包含my.package的路径,包括以my.package开头的

    Reflections reflections = new Reflections("my.package");

    使用ConfigurationBuilder

    new Reflections(new ConfigurationBuilder()

    .setUrls(ClasspathHelper.forPackage("my.project.prefix"))

    .setScanners(new SubTypesScanner(), new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...), .filterInputsBy(new FilterBuilder().includePackage("my.project.prefix")) ...);

    然后方便的使用查询方法,这要根据具体scanners配置

    SubTypesScanner

    Set> modules =

    reflections.getSubTypesOf(com.google.inject.Module.class);

    TypeAnnotationsScanner

    Set> singletons =

    reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);

    ResourcesScanner

    Setproperties =

    reflections.getResources(Pattern.compile(".*\\.properties"));

    MethodAnnotationsScanner

    Setresources =

    reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);

    Setinjectables =

    reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);

    FieldAnnotationsScanner

    Setids =

    reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

    MethodParameterScanner

    SetsomeMethods =

    reflections.getMethodsMatchParams(long.class, int.class);

    SetvoidMethods =

    reflections.getMethodsReturn(void.class);

    SetpathParamMethods =

    reflections.getMethodsWithAnyParamAnnotated(PathParam.class);

    MethodParameterNamesScanner

    ListparameterNames =

    reflections.getMethodParamNames(Method.class)

    MemberUsageScanner

    Setusages =

    reflections.getMethodUsages(Method.class)

    如果没有配置scanner,默认使用SubTypesScanner和TypeAnnotationsScanner

    也可以配置Classloader,用来解析某些实时类

    保证能够解析到url

    git上的例子:https://github.com/ronmamo/reflections/tree/master/src/test/java/org/reflections

    三. ReflectionUtils

    ReflectionsUtils包含了一些方便的方法,形式类似*getAllXXX(type, withYYY)

    比如

    import static org.reflections.ReflectionUtils.*;

    Setgetters = getAllMethods(someClass,

    withModifier(Modifier.PUBLIC), withPrefix("get"), withParametersCount(0)); //or SetlistMethodsFromCollectionToBoolean = getAllMethods(List.class, withParametersAssignableTo(Collection.class), withReturnType(boolean.class)); Setfields = getAllFields(SomeClass.class, withAnnotation(annotation), withTypeAssignableTo(type));

    四. ClasspathHelper

    获取包、class、classloader的方法

    使用maven可以很方便的集成到项目中,可以把浏览的元数据存储到xml/json文件中,下一次不必浏览,直接使用

    在maven中,使用Reflections Maven plugin插件

    其他用法

    并行查找url

    序列化查找为xml/json

    直接利用存储的元数据,快速load,不必再次scan

    存储模型实体为.java文件,可以通过静态方式引用types/fields/methods/annotation

    初始化srping的包浏览

    五. 注解的例子

    获取包中,带TaskOption注解的类,然后获取注解的task()

    Map, Class>> optionMap = new HashMap<>();

    for (Class> clazz : reflections.getTypesAnnotatedWith(TaskOption.class)) {

    TaskOption taskOption = clazz.getAnnotation(TaskOption.class);

    if (taskOption == null) continue; // this shouldn't happen optionMap.put(taskOption.task(), clazz); }

    展开全文
  • 我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息。使用方法如下:Reflections reflections = new ...

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息。使用方法如下:

    Reflections reflections = new Reflections("my.project");

    Set> subTypes = reflections.getSubTypesOf(SomeType.class);

    下面实例来说明如何使用的:

    定义接口:

    packagetest.reflection;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:16

    *@version1.0.0*/

    public interfaceBase {voiddoSomeThing();

    }

    定义子类1:

    packagetest.reflection;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:18

    *@version1.0.0*/

    public class SubClass1 implementsBase{

    @Overridepublic voiddoSomeThing() {

    System.out.println("SubClass1");

    }

    }

    定义子类2:

    packagetest.reflection;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:18

    *@version1.0.0*/

    public class SubClass2 implementsBase{

    @Overridepublic voiddoSomeThing() {

    System.out.println("SubClass2");

    }

    }

    测试获取所有Base的子类信息:

    packagetest.reflection;importorg.reflections.Reflections;importjava.util.Set;/*** 类功能描述://TODO

    *

    *@authorWangXueXing create at 19-5-4 下午10:19

    *@version1.0.0*/

    public classTest {public static voidmain(String[] args){

    Reflections reflections= new Reflections("test.reflection");

    Set> subTypes = reflections.getSubTypesOf(Base.class);

    subTypes.forEach(x->System.out.println(x));

    }

    }

    结果输出如下:

    class test.reflection.SubClass1

    class test.reflection.SubClass2

    如上如何获取所有子类信息。

    其实Reflections还有其他很有用的功能,如下了解下:

    一. Reflections的其他用法

    使用默认的scanners,浏览url包含my.package的路径,包括以my.package开头的

    Reflections reflections = new Reflections("my.package");

    使用ConfigurationBuilder

    new Reflections(new ConfigurationBuilder()

    .setUrls(ClasspathHelper.forPackage("my.project.prefix"))

    .setScanners(new SubTypesScanner(),

    new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...),

    .filterInputsBy(new FilterBuilder().includePackage("my.project.prefix"))

    ...);

    然后方便的使用查询方法,这要根据具体scanners配置

    SubTypesScanner

    Set> modules =

    reflections.getSubTypesOf(com.google.inject.Module.class);

    TypeAnnotationsScanner

    Set> singletons =

    reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);

    ResourcesScanner

    Set properties =

    reflections.getResources(Pattern.compile(".*\\.properties"));

    MethodAnnotationsScanner

    Set resources =

    reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);

    Set injectables =

    reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);

    FieldAnnotationsScanner

    Set ids =

    reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

    MethodParameterScanner

    Set someMethods =

    reflections.getMethodsMatchParams(long.class, int.class);

    Set voidMethods =

    reflections.getMethodsReturn(void.class);

    Set pathParamMethods =

    reflections.getMethodsWithAnyParamAnnotated(PathParam.class);

    MethodParameterNamesScanner

    List parameterNames =

    reflections.getMethodParamNames(Method.class)

    MemberUsageScanner

    Set usages =

    reflections.getMethodUsages(Method.class)

    如果没有配置scanner,默认使用SubTypesScanner和TypeAnnotationsScanner

    也可以配置Classloader,用来解析某些实时类

    保证能够解析到url

    git上的例子:https://github.com/ronmamo/reflections/tree/master/src/test/java/org/reflections

    三. ReflectionUtils

    ReflectionsUtils包含了一些方便的方法,形式类似*getAllXXX(type, withYYY)

    比如

    import static org.reflections.ReflectionUtils.*;

    Set getters = getAllMethods(someClass,

    withModifier(Modifier.PUBLIC), withPrefix("get"), withParametersCount(0));

    //or

    Set listMethodsFromCollectionToBoolean =

    getAllMethods(List.class,

    withParametersAssignableTo(Collection.class), withReturnType(boolean.class));

    Set fields = getAllFields(SomeClass.class, withAnnotation(annotation), withTypeAssignableTo(type));

    四. ClasspathHelper

    获取包、class、classloader的方法

    使用maven可以很方便的集成到项目中,可以把浏览的元数据存储到xml/json文件中,下一次不必浏览,直接使用

    在maven中,使用Reflections Maven plugin插件

    其他用法

    并行查找url

    序列化查找为xml/json

    直接利用存储的元数据,快速load,不必再次scan

    存储模型实体为.java文件,可以通过静态方式引用types/fields/methods/annotation

    初始化srping的包浏览

    五. 注解的例子

    获取包中,带TaskOption注解的类,然后获取注解的task()

    Map, Class>> optionMap = new HashMap<>();

    for (Class> clazz : reflections.getTypesAnnotatedWith(TaskOption.class)) {

    TaskOption taskOption = clazz.getAnnotation(TaskOption.class);

    if (taskOption == null) continue; // this shouldn't happen

    optionMap.put(taskOption.task(), clazz);

    }

    展开全文
  • Java 获取所有子类信息

    千次阅读 2019-06-14 16:39:47
    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息。使用方法如下: Reflections reflections = new ...

    我以前的博客(Java Scala获取注解的类信息)介绍过通过Reflections工具通过使用特定注解的类的信息,其实本工具也可以获取接口,抽象类,类等的所有子类信息。使用方法如下:

    Reflections reflections = new Reflections("my.project");
    Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

    下面实例来说明如何使用的:

    定义接口:

    复制代码

    package test.reflection;
    
    /**
     * 类功能描述://TODO
     *
     * @author WangXueXing create at 19-5-4 下午10:16
     * @version 1.0.0
     */
    public interface Base {
        void doSomeThing();
    }

    复制代码

     

    定义子类1:

    复制代码

    package test.reflection;
    
    /**
     * 类功能描述://TODO
     *
     * @author WangXueXing create at 19-5-4 下午10:18
     * @version 1.0.0
     */
    public class SubClass1 implements Base{
        @Override
        public void doSomeThing() {
            System.out.println("SubClass1");
        }
    }

    复制代码

     

    定义子类2:

    复制代码

    package test.reflection;
    
    /**
     * 类功能描述://TODO
     *
     * @author WangXueXing create at 19-5-4 下午10:18
     * @version 1.0.0
     */
    public class SubClass2 implements Base{
        @Override
        public void doSomeThing() {
            System.out.println("SubClass2");
        }
    }

    复制代码

     

    测试获取所有Base的子类信息:

    复制代码

    package test.reflection;
    
    import org.reflections.Reflections;
    
    import java.util.Set;
    
    /**
     * 类功能描述://TODO
     *
     * @author WangXueXing create at 19-5-4 下午10:19
     * @version 1.0.0
     */
    public class Test {
        public static void main(String[] args){
            Reflections reflections = new Reflections("test.reflection");
            Set<Class<? extends Base>> subTypes = reflections.getSubTypesOf(Base.class);
            subTypes.forEach(x -> System.out.println(x));
        }
    }

    复制代码

     

    结果输出如下:

    class test.reflection.SubClass1
    class test.reflection.SubClass2

     

    如上如何获取所有子类信息。

     

    其实Reflections还有其他很有用的功能,如下了解下:

    一. Reflections的其他用法

    使用默认的scanners,浏览url包含my.package的路径,包括以my.package开头的

    Reflections reflections = new Reflections("my.package");

    使用ConfigurationBuilder

    new Reflections(new ConfigurationBuilder()
         .setUrls(ClasspathHelper.forPackage("my.project.prefix"))
         .setScanners(new SubTypesScanner(), 
                      new TypeAnnotationsScanner().filterResultsBy(optionalFilter), ...),
         .filterInputsBy(new FilterBuilder().includePackage("my.project.prefix"))
         ...);

    然后方便的使用查询方法,这要根据具体scanners配置
    SubTypesScanner

    Set<Class<? extends Module>> modules = 
        reflections.getSubTypesOf(com.google.inject.Module.class);

    TypeAnnotationsScanner

    Set<Class<?>> singletons = 
        reflections.getTypesAnnotatedWith(javax.inject.Singleton.class);

    ResourcesScanner

    Set<String> properties = 
        reflections.getResources(Pattern.compile(".*\\.properties"));

    MethodAnnotationsScanner

    Set<Method> resources =
        reflections.getMethodsAnnotatedWith(javax.ws.rs.Path.class);
    Set<Constructor> injectables = 
        reflections.getConstructorsAnnotatedWith(javax.inject.Inject.class);

    FieldAnnotationsScanner

    Set<Field> ids = 
        reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);

    MethodParameterScanner

    Set<Method> someMethods =
        reflections.getMethodsMatchParams(long.class, int.class);
    Set<Method> voidMethods =
        reflections.getMethodsReturn(void.class);
    Set<Method> pathParamMethods =
        reflections.getMethodsWithAnyParamAnnotated(PathParam.class);

    MethodParameterNamesScanner

    List<String> parameterNames = 
        reflections.getMethodParamNames(Method.class)

    MemberUsageScanner

    Set<Member> usages = 
        reflections.getMethodUsages(Method.class)

    如果没有配置scanner,默认使用SubTypesScannerTypeAnnotationsScanner
    也可以配置Classloader,用来解析某些实时类
    保证能够解析到url
    git上的例子:https://github.com/ronmamo/reflections/tree/master/src/test/java/org/reflections

    三. ReflectionUtils

    ReflectionsUtils包含了一些方便的方法,形式类似*getAllXXX(type, withYYY)
    比如

    import static org.reflections.ReflectionUtils.*;
    
    Set<Method> getters = getAllMethods(someClass,
      withModifier(Modifier.PUBLIC), withPrefix("get"), withParametersCount(0));
    
    //or
    Set<Method> listMethodsFromCollectionToBoolean = 
      getAllMethods(List.class,
        withParametersAssignableTo(Collection.class), withReturnType(boolean.class));
    
    Set<Fields> fields = getAllFields(SomeClass.class, withAnnotation(annotation), withTypeAssignableTo(type));

    四. ClasspathHelper

    获取包、class、classloader的方法
    使用maven可以很方便的集成到项目中,可以把浏览的元数据存储到xml/json文件中,下一次不必浏览,直接使用
    在maven中,使用Reflections Maven plugin插件
    其他用法

    • 并行查找url
    • 序列化查找为xml/json
    • 直接利用存储的元数据,快速load,不必再次scan
    • 存储模型实体为.java文件,可以通过静态方式引用types/fields/methods/annotation
    • 初始化srping的包浏览

    五. 注解的例子

    获取包中,带TaskOption注解的类,然后获取注解的task()

        Map<Class<? extends Task>, Class<?>> optionMap = new HashMap<>();
        for (Class<?> clazz : reflections.getTypesAnnotatedWith(TaskOption.class)) {
            TaskOption taskOption = clazz.getAnnotation(TaskOption.class);
            if (taskOption == null) continue; // this shouldn't happen
            optionMap.put(taskOption.task(), clazz);
        }

    每天一点成长,欢迎指正!

     

    转载自:https://www.cnblogs.com/barrywxx/p/10810183.html

    展开全文
  • Java获取所有子类、实现类

    千次阅读 2019-09-13 17:07:16
    功能说明:下拉选择某个接口的所有实现类,方面运维人员通过界面配置相关功能,而不是手动复制粘贴。...扫描某个类的所有子类。 需要依赖第三类库:reflections google code项目主页: htt...
    功能说明:下拉选择某个接口的所有实现类,方面运维人员通过界面配置相关功能,而不是手动复制粘贴。
    需求说明:扫描jvm中某个接口的所有实现类;扫描某个类的所有子类。


    需要依赖第三类库:reflections  
    google code项目主页: https://code.google.com/p/reflections/

    已经知道继承关系:

    Java测试代码:

    public static void main(String[] args) {
    		Reflections reflections = new Reflections("com", new SubTypesScanner(true));
    		Set<String> allClasses = reflections.getStore().getSubTypesOf(IDog.class.getName());
    		for (String string : allClasses) {
    			System.out.println(string);
    		}
    	}

    程序执行结果:

    2015-12-30 20:55:35 org.reflections.Reflections scan 
    信息: Reflections took 108 ms to scan 4 urls, producing 191 keys and 645 values  
    com.dog.IBlackDog 
    com.dog.abs.AbstractWhiteDog 
    com.dog.abs.impl.SmallWhiteDog 
    com.dog.abs.AbstractBlackDog 
    com.dog.abs.impl.SmallBlackDog 
    com.dog.IWhiteDog


    环境说明:win7+jdk1.6.0_45

    扩展说明(多结果稍作过滤可以实现):
    1.扫描所有接口的实现类
    2.扫描所有接口的非抽象的实现类
    3.扫描类的子类
    4.扫描接口的子接口

    转载于:https://my.oschina.net/pengyan5945/blog/593634

    展开全文
  • JAVA中,获取一个类的全部父类是比较简单的,只需要通过反射(Class的getSuperclass()方法)即可。然而,如果想获得一个类的所有子类,或者获得实现某一个接口的所有实现类,相对比较麻烦。用过Eclipse的开发人员都...
  • JAVA中,获取一个类的全部父类是比较简单的,只需要通过反射(Class的getSuperclass()方法)即可。然而,如果想获得一个类的所有子类,或者获得实现某一个接口的所有实现类,相对比较麻烦。用过Eclipse的开发人员都...
  • 一、概述如何去尝试找到Java中给定类的所有子类(或给定接口的所有实现者)?到目前为止,我有一种方法可以执行此操作,但是我发现它效率很低(至少可以这样说)。方法是:获取类路径上存在的所有类名称的列表加载每个类...
  • JAVA中,获取一个类的全部父类是比较简单的,只需要通过反射(Class的getSuperclass()方法)即可。然而,如果想获得一个类的所有子类,或者获得实现某一个接口的所有实现类,相对比较麻烦。用过Eclipse的开发人员都...
  • 展开全部1、面向对象思想的继承是子类继承父类,父类被其它子类继承在JAVA虚拟机的容器中并没有直62616964757a686964616fe78988e69d8331333337616532接接口获取;2、如果是在一个项目内获取父类的子类继承情况,参考...
  • import java.io.File;import java.io.IOException;import java.net.URL;import java.util.ArrayList;import java.util.List;import find.test.Intf;import find.test.Man;public class ClassUtil {publ...
  • * 获取本类及其父类的属性的方法 * @param clazz 当前类对象 * @return 字段数组 */ private static Field[] getAllFields(Class<?> clazz) { List<Field> fieldList = new ArrayList<>(); ...
  • import java.io.File;import java.io.IOException;import java.net.URL;import java.util.ArrayList;import java.util.List;import find.test.Intf;import find.test.Man;public class ClassUtil {publ...
  • 如何在Java中找到给定类的所有子类?如何在Java中尝试查找给定类(或给定接口的所有实现者)的所有子类?截至目前,我有一种方法可以做到这一点,但我觉得效率很低(至少可以说)。方法是:获取类路径上存在的所有类名的...
  • JAVA获取所有接口的实现类或父类的所有子类(同路径下) package find; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util....
  • import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import find.test.Intf; import find.test.Man; public class ClassUtil { ...
  • 匿名用户1级2009-03-17 回答1、面向对象思想的继承是子类继承父类,父类被其它子类继承在JAVA虚拟机的容器中并没有直接接口获取;2、如果是在一个项目内获取父类的子类继承情况,参考这个代码:packagefind;import...
  • java中规定:一个父类可以有多个子类,但是一个子类只能有一个父类。子类可以通过extends关键字来继承父类。做个比较通俗的比喻,就像一个父亲可以有多个亲孩子,但是一个孩子只能有一个亲生父亲。通过继承,子类...
  • java反射获取所有属性,获取所有get方法,包括子类父类,以及包括List集合类
  • 因为子类可以继承父类的所有功能,如果有两个父类的功能名称都相同,那么子类继承后调用的方法到底是哪个类我们就不清楚。一个文件中可以同时声明多个类,但是最多只能有一个public的类,如果是public则必须和文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 636
精华内容 254
关键字:

java获取所有子类

java 订阅