Java reflection find all classes

YepYep

final List> processorCandidates = ReflectionHelper.findClassesImpmenenting(HostDataProcessor.class, HostDataProcessor.class.getPackage()); 
public class ReflectionHelper < public static List> findClassesImpmenenting(final Class interfaceClass, final Package fromPackage) < if (interfaceClass == null) < Debug.println("Unknown subclass."); return null; >if (fromPackage == null) < Debug.println("Unknown package."); return null; >final List> rVal = new ArrayList>(); try < final Class[] targets = getAllClassesFromPackage(fromPackage.getName()); if (targets != null) < for (ClassaTarget : targets) < if (aTarget == null) < continue; >else if (aTarget.equals(interfaceClass)) < Debug.println("Found the interface definition."); continue; >else if (!interfaceClass.isAssignableFrom(aTarget)) < Debug.println("Class '" + aTarget.getName() + "' is not a " + interfaceClass.getName()); continue; >else < rVal.add(aTarget); >> > > catch (ClassNotFoundException e) < Debug.println("Error reading package name."); Debug.printStackTrace(e, Debug.LOW_LEVEL); >catch (IOException e) < Debug.println("Error reading classes in package."); Debug.printStackTrace(e, Debug.LOW_LEVEL); >return rVal; > /** * Load all classes from a package. * * @param packageName * @return * @throws ClassNotFoundException * @throws IOException */ public static Class[] getAllClassesFromPackage(final String packageName) throws ClassNotFoundException, IOException < ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); assert classLoader != null; String path = packageName.replace('.', '/'); Enumerationresources = classLoader.getResources(path); List dirs = new ArrayList(); while (resources.hasMoreElements()) < URL resource = resources.nextElement(); dirs.add(new File(resource.getFile())); >ArrayList classes = new ArrayList(); for (File directory : dirs) < classes.addAll(findClasses(directory, packageName)); >return classes.toArray(new Class[classes.size()]); > /** * Find file in package. * * @param directory * @param packageName * @return * @throws ClassNotFoundException */ public static List> findClasses(File directory, String packageName) throws ClassNotFoundException < List> classes = new ArrayList>(); if (!directory.exists()) < return classes; >File[] files = directory.listFiles(); for (File file : files) < if (file.isDirectory()) < assert !file.getName().contains("."); classes.addAll(findClasses(file, packageName + "." + file.getName())); >else if (file.getName().endsWith(".class")) < classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6))); >> return classes; > > 

Источник

Читайте также:  Update operation in java

Поиск всех классов в пакете Java

Иногда мы хотим получить информацию о поведении нашего приложения во время выполнения, например найти все классы, доступные во время выполнения.

В этом руководстве мы рассмотрим несколько примеров того, как найти все классы в пакете Java во время выполнения.

2. Загрузчики классов​

Во-первых, мы начнем обсуждение с загрузчиков классов Java . Загрузчик классов Java является частью среды выполнения Java (JRE), которая динамически загружает классы Java в виртуальную машину Java (JVM). Загрузчик классов Java отделяет JRE от знаний о файлах и файловых системах. Не все классы загружаются одним загрузчиком классов .

Давайте разберемся с доступными загрузчиками классов в Java через графическое представление:

В Java 9 были внесены некоторые серьезные изменения в загрузчики классов. С введением модулей у нас есть возможность указать путь к модулю вместе с путем к классам. Загрузчик системных классов загружает классы, присутствующие в пути к модулю.

Загрузчики классов являются динамическими . От них не требуется сообщать JVM, какие классы она может предоставлять во время выполнения. Следовательно, поиск классов в пакете — это, по сути, операция файловой системы, а не операция, выполняемая с помощью Java Reflection .

Однако мы можем написать собственные загрузчики классов или изучить путь к классам, чтобы найти классы внутри пакета.

3. Поиск классов в пакете Java​

Для нашей иллюстрации давайте создадим пакет

 com.foreach.reflection.access.packages.search 

Источник

Can you find all classes in a package using reflection?

Yes, it is possible to find all classes in a package using reflection in Java. You can use the ClassLoader.getSystemClassLoader() method to get the system class loader and then use the loadClass method to load all the classes in a package. Here is an example of how you can do this:

String packageName = "com.example.mypackage"; ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL packageURL; packageURL = classLoader.getResource(packageName); if (packageURL != null) < String packagePath = packageURL.getPath(); if (packagePath != null) < File packageDir = new File(packagePath); if (packageDir.isDirectory()) < File[] files = packageDir.listFiles(); for (File file : files) < String className = file.getName(); if (className.endsWith(".class")) < className = packageName + "." + className.substring(0, className.length() - 6); Class clazz = classLoader.loadClass(className); // do something with the class > > > > >

This code will find all the classes in the package com.example.mypackage and load them using the system class loader. You can then do something with the classes, such as calling a method or instantiating an object.

Источник

In Java How to Find List of all Class Names from inside .jar File? – Jar Class Finder Utility with Java Reflection

This tutorial will be very interesting. Last week I was working on a Java Project which requires me to have list of Classes from .jar file. With the help of JarEntry and JarInputStream utility I was able to extract all classes from inside of .jar file.

JarInputStream creates a new JarInputStream and reads the optional manifest. If a manifest is present, also attempts to verify the signatures if the JarInputStream is signed.

Below solution will also work for your if you have any of below query:

  • In Java – How to find a class somewhere inside dozens of JAR files
  • How to get names of classes inside a jar file?
  • Looking for a Java class in a set of JARs with find

how-to-find-list-of-all-class-names-from-inside-jar-file

Let’s get started. We will perform below steps.

  1. Create class CrunchifyFindClassesFromJar.java
  2. Create utility method called getCrunchifyClassNamesFromJar(String jarFileName)
  3. Iterate through nextJarEntry and if found remove .class from name add it to JSON list
  4. Print JSONObject containing above class list
package com.crunchify.tutorial; import java.io.FileInputStream; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import org.json.JSONArray; import org.json.JSONObject; /** * @author Crunchify.com * */ public class CrunchifyFindClassesFromJar < @SuppressWarnings("resource") public static JSONObject getCrunchifyClassNamesFromJar(String crunchifyJarName) < JSONArray listofClasses = new JSONArray(); JSONObject crunchifyObject = new JSONObject(); try < JarInputStream crunchifyJarFile = new JarInputStream(new FileInputStream(crunchifyJarName)); JarEntry crunchifyJar; while (true) < crunchifyJar = crunchifyJarFile.getNextJarEntry(); if (crunchifyJar == null) < break; >if ((crunchifyJar.getName().endsWith(".class"))) < String className = crunchifyJar.getName().replaceAll("/", "\\."); String myClass = className.substring(0, className.lastIndexOf('.')); listofClasses.put(myClass); >> crunchifyObject.put("Jar File Name", crunchifyJarName); crunchifyObject.put("List of Class", listofClasses); > catch (Exception e) < System.out.println("Oops.. Encounter an issue while parsing jar" + e.toString()); >return crunchifyObject; > public static void main(String[] args) < JSONObject myList = getCrunchifyClassNamesFromJar("/Users//Documents/javax.servlet.jsp.jar"); System.out.println(myList); > >
< "List of Class": [ "javax.el.ArrayELResolver", "javax.el.BeanELResolver$BeanProperties", "javax.el.BeanELResolver$BeanProperty", "javax.el.BeanELResolver", "javax.el.CompositeELResolver$CompositeIterator", "javax.el.CompositeELResolver", "javax.el.ELContext", "javax.el.ELContextEvent", . . so many more. ], "Jar File Name": "/Users//Documents/javax.servlet.jsp.jar" >

Bonus point:

Check out how to find if particular jar contains specific method.

try < ClasscrunchifyClass = Class.forName(className); Method main = crunchifyClass.getDeclaredMethod("yourMethodName"); main.invoke(null); > catch (Exception e)

Hope this mini utility will help if you want to quickly achieve the same goal. Feel free to use it in your production project.

If you liked this article, then please share it on social media. Have a question or suggestion? Please leave a comment to start the discussion.

Источник

Оцените статью