How to find all the packages in a Project with a Prefix

Points To Remember

  • You to need to add the Reflections jar in the class path. 
  • You will not be able to load the packages other than the current package using Package.getPackages() since current class loader will not be able to reach them.

Program : Scan all packages with a Prefix

You can use Package.getPackages() approach to find all the packages that are in the current class loader. But you will not be able to get the packages that are not in the class path of the current class loader. So you need to include the jar "Reflections" to do this for you.
All the dependency to the project via pom.xml or you can add the jar in the class path of the project.

The following code will list all the packages in the project that start with the prefix in the project.

 public static Set<String> findAllPackagesStartingWith(String prefix) {
     List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
     classLoadersList.add(ClasspathHelper.contextClassLoader());
     classLoadersList.add(ClasspathHelper.staticClassLoader());
     Reflections reflections = new Reflections(new ConfigurationBuilder()
             .setScanners(new SubTypesScanner(false), new ResourcesScanner())
             .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
             .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(prefix))));
     Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);

     Set<String> packageNameSet = new TreeSet<String>();
     for (Class<?> classInstance : classes) {
         String packageName = classInstance.getPackage().getName();
         if (packageName.startsWith(prefix)) {
             packageNameSet.add(packageName);
         }
     }
     for(String t : packageNameSet){
      System.out.println(":::"+t);
     }
     return packageNameSet;
 }

If you want the packages in the project in the form of Package class you can do
public Set<Package> findAllPackagesStartingWith(String prefix) {
     List<ClassLoader> classLoadersList = new LinkedList<ClassLoader>();
     classLoadersList.add(ClasspathHelper.contextClassLoader());
     classLoadersList.add(ClasspathHelper.staticClassLoader());
     Reflections reflections = new Reflections(new ConfigurationBuilder()
             .setScanners(new SubTypesScanner(false), new ResourcesScanner())
             .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
             .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(prefix))));
     Set<Class<? extends Object>> classes = reflections.getSubTypesOf(Object.class);

     Set<Package> packageNameSet = new TreeSet<Package>();
     for (Class<?> classInstance : classes) {
         if (classInstance.getPackage().getName().startsWith(prefix)) {
             packageNameSet.add(classInstance.getPackage());
         }
     }
     
     return packageNameSet;
 }
When we run the above code in a demo java project and call the function as findAllPackagesStartingWith("java"); we will get a output like the following. The output may differ for you depending upon the packages in your project.
package = javassist
package = javassist.bytecode
package = javassist.bytecode.analysis
package = javassist.bytecode.annotation
package = javassist.bytecode.stackmap
package = javassist.compiler
package = javassist.compiler.ast
package = javassist.convert
package = javassist.expr
package = javassist.runtime
package = javassist.scopedpool
package = javassist.tools
package = javassist.tools.reflect
package = javassist.tools.rmi
package = javassist.tools.web
package = javassist.util
package = javassist.util.proxy
package = javax.annotation
package = javax.annotation.concurrent
package = javax.annotation.meta
package = javax.xml.parsers
package = javax.xml.transform
package = javax.xml.transform.dom
package = javax.xml.transform.sax
package = javax.xml.transform.stream

No comments :

Post a Comment