• Java反射工具类


    1. /**
    2. * @Description: 反射工具类
    3. */
    4. public class ReflectionUtil {
    5. /**
    6. * 定义类集合(用于存放所有加载的类)
    7. */
    8. private static final Set> CLASS_SET;
    9. static {
    10. //指定加载包路径
    11. CLASS_SET = getClassSet("com.yaolong");
    12. }
    13. /**
    14. * 获取类加载器
    15. * @return
    16. */
    17. public static ClassLoader getClassLoader(){
    18. return Thread.currentThread().getContextClassLoader();
    19. }
    20. /**
    21. * 加载类
    22. * @param className 类全限定名称
    23. * @param isInitialized 是否在加载完成后执行静态代码块
    24. * @return
    25. */
    26. public static Class loadClass(String className,boolean isInitialized) {
    27. Class cls;
    28. try {
    29. cls = Class.forName(className,isInitialized,getClassLoader());
    30. } catch (ClassNotFoundException e) {
    31. throw new RuntimeException(e);
    32. }
    33. return cls;
    34. }
    35. public static Class loadClass(String className) {
    36. return loadClass(className,true);
    37. }
    38. /**
    39. * 获取指定包下所有类
    40. * @param packageName
    41. * @return
    42. */
    43. public static Set> getClassSet(String packageName) {
    44. Set> classSet = new HashSet<>();
    45. try {
    46. Enumeration urls = getClassLoader().getResources(packageName.replace(".","/"));
    47. while (urls.hasMoreElements()) {
    48. URL url = urls.nextElement();
    49. if (url != null) {
    50. String protocol = url.getProtocol();
    51. if (protocol.equals("file")) {
    52. String packagePath = url.getPath().replace("%20","");
    53. addClass(classSet,packagePath,packageName);
    54. } else if (protocol.equals("jar")) {
    55. JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();
    56. if (jarURLConnection != null) {
    57. JarFile jarFile = jarURLConnection.getJarFile();
    58. if (jarFile != null) {
    59. Enumeration jarEntries = jarFile.entries();
    60. while (jarEntries.hasMoreElements()) {
    61. JarEntry jarEntry = jarEntries.nextElement();
    62. String jarEntryName = jarEntry.getName();
    63. if (jarEntryName.endsWith(".class")) {
    64. String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");
    65. doAddClass(classSet,className);
    66. }
    67. }
    68. }
    69. }
    70. }
    71. }
    72. }
    73. } catch (IOException e) {
    74. throw new RuntimeException(e);
    75. }
    76. return classSet;
    77. }
    78. private static void doAddClass(Set> classSet, String className) {
    79. Class cls = loadClass(className,false);
    80. classSet.add(cls);
    81. }
    82. private static void addClass(Set> classSet, String packagePath, String packageName) {
    83. final File[] files = new File(packagePath).listFiles(new FileFilter() {
    84. @Override
    85. public boolean accept(File file) {
    86. return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory();
    87. }
    88. });
    89. for (File file : files) {
    90. String fileName = file.getName();
    91. if (file.isFile()) {
    92. String className = fileName.substring(0, fileName.lastIndexOf("."));
    93. if (StringUtils.isNotEmpty(packageName)) {
    94. className = packageName + "." + className;
    95. }
    96. doAddClass(classSet,className);
    97. } else {
    98. String subPackagePath = fileName;
    99. if (StringUtils.isNotEmpty(packagePath)) {
    100. subPackagePath = packagePath + "/" + subPackagePath;
    101. }
    102. String subPackageName = fileName;
    103. if (StringUtils.isNotEmpty(packageName)) {
    104. subPackageName = packageName + "." + subPackageName;
    105. }
    106. addClass(classSet,subPackagePath,subPackageName);
    107. }
    108. }
    109. }
    110. public static Set> getClassSet() {
    111. return CLASS_SET;
    112. }
    113. /**
    114. * 获取应用包名下某父类(或接口)的所有子类(或实现类)
    115. * @param superClass
    116. * @return
    117. */
    118. public static Set> getClassSetBySuper(Class superClass) {
    119. Set> classSet = new HashSet<>();
    120. for (Class cls : CLASS_SET) {
    121. if (superClass.isAssignableFrom(cls) && !superClass.equals(cls)) {
    122. classSet.add(cls);
    123. }
    124. }
    125. return classSet;
    126. }
    127. /**
    128. * 获取应用包名下带有某注解的类
    129. * @param annotationClass
    130. * @return
    131. */
    132. public static Set> getClassSetByAnnotation(Classextends Annotation> annotationClass) {
    133. Set> classSet = new HashSet<>();
    134. for (Class cls : CLASS_SET) {
    135. if (cls.isAnnotationPresent(annotationClass)) {
    136. classSet.add(cls);
    137. }
    138. }
    139. return classSet;
    140. }
    141. }

    使用:

    1. public static List getReceiptHandlerList(){
    2. List receiptHandlerList = new ArrayList<>();
    3. //获取IReceiptHandler接口的实现类
    4. Set> classList = ReflectionUtil.getClassSetBySuper(IReceiptHandler.class);
    5. if (classList != null && classList.size() > 0) {
    6. for (Class clazz : classList) {
    7. try {
    8. receiptHandlerList.add((IReceiptHandler)clazz.newInstance());
    9. } catch ( Exception e) {
    10. e.printStackTrace();
    11. }
    12. }
    13. }
    14. return receiptHandlerList;
    15. }

     

  • 相关阅读:
    硅-罗丹明-二苯并环辛炔;硅基罗丹明-二苯并环辛炔染料,SIR-DBCO,CAS号:2259859-41-9
    随便看看官方教程-FPS Microgame
    【MindSpore易点通】MindSpore Data经验解析
    k8s基础 随笔
    Hello Playwright:(3)基本概念
    JavaScript学习之路---js基础(基本语法,认识js)
    【TypeScript】-- TS之面向对象
    异步电机直接转矩控制学习
    48.排列问题求解
    Part2_扩展MATSIM_Subpart4_除个人车外的其他模式_第18章 公交路线图匹配半自动工具
  • 原文地址:https://blog.csdn.net/guo__hang/article/details/134458011