目录
=============
■java代码
package com.sxz.study.reflect;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class Test {
public static void main(String[] args) {
System.out.println("Test Reflect");
// Search Target Class
Class<?> searchClass = com.sxz.study.classload.Parent.class;
// Search Target Package Name
String searchPackageName = "com.sxz.study";
List<Class<?>> subClasses = getSubClasses(searchClass, searchPackageName);
System.out.println(" Result ========================================== Result");
for (Class<?> subClass : subClasses) {
System.out.println(subClass.getName());
}
}
/**
*
* Get SubClass Search From Package
*
* @param parentClass
* @param packageName
* @return
*/
public static List<Class<?>> getSubClasses(Class<?> parentClass, String packageName) {
List<Class<?>> subClasses = new ArrayList<>();
try {
System.out.println("========================================== Now Load Package Begin.");
Package[] packages = Package.getPackages();
for (Package pkg : packages) {
System.out.println(pkg.getName());
}
System.out.println("========================================== Now Load Package End.");
// Get Class from package.
List<Class<?>> classes = getClasses(packageName);
for (Class<?> clazz : classes) {
System.out.println(clazz.getTypeName());
// Is SubClass ?
if (parentClass.isAssignableFrom(clazz) && !clazz.equals(parentClass)) {
subClasses.add(clazz);
}
}
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
return subClasses;
}
/**
*
* Get Class from package.
*
* @param packageName
* @return
* @throws ClassNotFoundException
*/
public static List<Class<?>> getClasses(String packageName) throws ClassNotFoundException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String path = packageName.replace('.', '/');
Enumeration<URL> resources;
try {
resources = classLoader.getResources(path);
} catch (IOException e) {
throw new ClassNotFoundException("Package not found", e);
}
List<File> dirs = new ArrayList<>();
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
List<Class<?>> classes = new ArrayList<>();
for (File directory : dirs) {
classes.addAll(findClasses(directory, packageName));
}
return classes;
}
/**
*
* @param directory
* @param packageName
* @return
* @throws ClassNotFoundException
*/
private static List<Class<?>> findClasses(File directory, String packageName) throws ClassNotFoundException {
List<Class<?>> 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;
}
}
===
■注意
所有被扫描的类,都会被加载
■运行效果(Eclipse中运行)
Test Reflect
========================================== Now Load Package Begin.
sun.reflect
java.util
sun.reflect.annotation
java.lang.annotation
java.nio
sun.nio
java.security.cert
java.util.zip
sun.launcher
sun.security.action
java.nio.file
com.sxz.study.reflect
java.nio.charset
sun.net.www
java.lang.ref
java.net
jdk.internal.util
sun.net.www.protocol.file
java.lang.invoke
sun.util.locale
sun.reflect.generics.repository
com.sxz.study.classload
sun.misc
java.lang.reflect
sun.net.util
java.security
sun.net.www.protocol.jar
java.util.concurrent
sun.io
java.util.concurrent.atomic
java.util.concurrent.