com.github.andyshao.reflect.PackageOperation Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Gear Show documentation
Show all versions of Gear Show documentation
Enhance and formating the coding of JDK
The newest version!
package com.github.andyshao.reflect;
import com.github.andyshao.lang.GeneralSystemProperty;
import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
*
* Title:
* Descript:
* Copyright: Copryright(c) Jan 24, 2016
* Encoding:UNIX UTF-8
*
* @author Andy.Shao
*
*/
public final class PackageOperation {
/**
* get classes from {@link Path}
* @param jarPath jar location
* @return the class name list
*/
public static String[] getClasses(Path jarPath) {
List result = new ArrayList<>();
try (JarFile jar = new JarFile(jarPath.toFile());) {
Enumeration entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String name = entry.getName();
//The jar entry which end with '/' is a package
if (name.charAt(0) == '/') name = name.substring(1);
if (name.endsWith(".class") && !entry.isDirectory()) {
String className = name.substring(0 , name.length() - 6).replace('/' , '.');
result.add(className);
}
}
} catch (IOException e) {
throw new ReflectiveOperationException(e);
}
return result.toArray(new String[result.size()]);
}
/**
* get package class name
* @param pkg {@link Package}
* @return class name list
*/
public static String[] getPackageClassName(Package pkg) {
List result = new ArrayList<>();
String packageName = pkg.getName();
String packageDirName = packageName.replace('.' , '/');
try {
Enumeration dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
while (dirs.hasMoreElements()) {
URL url = dirs.nextElement();
final String protocol = url.getProtocol();
if ("file".equals(protocol)) {
String filePath = URLDecoder.decode(url.getFile() , GeneralSystemProperty.FILE_ENCODING.value());
File dir = new File(filePath);
if (!dir.exists() || !dir.isDirectory()) ;
File[] dirFiles = dir.listFiles((file) -> file.isDirectory() || file.getName().endsWith(".class"));
for (File file : dirFiles) {
if (file.isDirectory()) continue;
String className = file.getName().substring(0 , file.getName().length() - 6);
result.add(packageName + '.' + className);
}
} else if ("jar".equals(protocol)) try (JarFile jar = ((JarURLConnection) url.openConnection()).getJarFile();) {
Enumeration entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String name = entry.getName();
//The jar entry which end with '/' is a package
if (name.charAt(0) == '/') name = name.substring(1);
if (name.startsWith(packageDirName) && name.endsWith(".class") && !entry.isDirectory()) {
String className = name.substring(0 , name.length() - 6).replace('/' , '.');
result.add(className);
}
}
}
}
} catch (IOException e) {
throw new ClassNotFoundException(e);
}
return result.toArray(new String[result.size()]);
}
/**
* get package class
* @param pkg {@link Package}
* @return {@link Class} list
*/
public static Class>[] getPackageClasses(Package pkg) {
List> result = new ArrayList<>();
String packageName = pkg.getName();
String packageDirName = packageName.replace('.' , '/');
try {
Enumeration dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
while (dirs.hasMoreElements()) {
URL url = dirs.nextElement();
final String protocol = url.getProtocol();
if ("file".equals(protocol)) {
String filePath = URLDecoder.decode(url.getFile() , GeneralSystemProperty.FILE_ENCODING.value());
File dir = new File(filePath);
if (!dir.exists() || !dir.isDirectory()) ;
File[] dirFiles = dir.listFiles((file) -> file.isDirectory() || file.getName().endsWith(".class"));
for (File file : dirFiles) {
if (file.isDirectory()) continue;
String className = file.getName().substring(0 , file.getName().length() - 6);
result.add(ClassOperation.forName(packageName + '.' + className));
}
} else if ("jar".equals(protocol)) try (JarFile jar = ((JarURLConnection) url.openConnection()).getJarFile();) {
Enumeration entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String name = entry.getName();
//The jar entry which end with '/' is a package
if (name.charAt(0) == '/') name = name.substring(1);
if (name.startsWith(packageDirName) && name.endsWith(".class") && !entry.isDirectory()) {
String className = name.substring(0 , name.length() - 6).replace('/' , '.');
result.add(ClassOperation.forName(className));
}
}
}
}
} catch (IOException e) {
throw new ClassNotFoundException(e);
}
return result.toArray(new Class>[result.size()]);
}
/**
* get package by regex expression
* @param regex regex expression
* @return {@link Package} list
*/
public static Package[] getPackages(String regex) {
List result = new ArrayList<>();
Package[] packages = Package.getPackages();
for (Package pkg : packages)
if (pkg.getName().matches(regex)) result.add(pkg);
return result.toArray(new Package[result.size()]);
}
/**
* get packages
* @param basePackage base package
* @return {@link Package} list
*/
public static Package[] getPackages(Package basePackage) {
List result = new ArrayList<>();
Package[] packages = Package.getPackages();
for (Package ppkg : packages)
if (ppkg.getName().startsWith(basePackage.getName())) result.add(ppkg);
return result.toArray(new Package[result.size()]);
}
private PackageOperation() {
throw new AssertionError("No support instance " + PackageOperation.class + " for you!");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy