public static void main(String[] args) {
String pkgs = "com";
loadByClassLoader(pkgs);
//loadByResolverUtil();
}
public static void loadByResolverUtil(String pkgs){
ResolverUtil<Class> resolver = new ResolverUtil<Class>();
resolver.findInPackage(new Test() {
public boolean matches(Class type) {
// TODO: should also find annotated classes
// return (Action.class.isAssignableFrom(type) ||
// type.getSimpleName().endsWith("Action"));
return true;
}
}, pkgs);
System.out.println(resolver.getClasses().size());
for (Class<?> actionClass : resolver.getClasses()) {
System.out.println(actionClass.getName());
}
}
public static void loadByClassLoader(String pkgs) {
ClassLoader loader = ClassLoader.getSystemClassLoader();
Enumeration<URL> urls;
try {
urls = loader.getResources(pkgs);
while (urls.hasMoreElements()) {
String urlPath = urls.nextElement().getFile();
// urlPath = URLDecoder.decode(urlPath, "UTF-8");
// If it's a file in a directory, trim the stupid file: spec
if (urlPath.startsWith("file:"))
urlPath = urlPath.substring(5);
// Else it's in a JAR, grab the path to the jar
if (urlPath.indexOf('!') > 0)
urlPath = urlPath.substring(0, urlPath.indexOf('!'));
// log.info("Scanning for classes in [" + urlPath + "] matching
// criteria: " + test);
File file = new File(urlPath);
if (file.isDirectory())
loadImplementationsInDirectory(pkgs, file);
else
loadImplementationsInJar(pkgs, file);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void loadImplementationsInDirectory(String parent, File location) {
File[] files = location.listFiles();
StringBuilder builder = null;
for (File file : files) {
builder = new StringBuilder(100);
builder.append(parent).append("/").append(file.getName());
String packageOrClass = (parent == null ? file.getName() : builder.toString());
if (file.isDirectory())
loadImplementationsInDirectory(packageOrClass, file);
else if (file.getName().endsWith(".class"))
addIfMatching(packageOrClass);
}
}
/**
* Finds matching classes within a jar files that contains a folder
* structure matching the package structure. If the File is not a JarFile or
* does not exist a warning will be logged, but no error will be raised.
*
* @param test
* a Test used to filter the classes that are discovered
* @param parent
* the parent package under which classes must be in order to be
* considered
* @param jarfile
* the jar file to be examined for classes
*/
public static void loadImplementationsInJar(String parent, File jarfile) {
try {
JarEntry entry;
JarInputStream jarStream = new JarInputStream(new FileInputStream(jarfile));
while ((entry = jarStream.getNextJarEntry()) != null) {
String name = entry.getName();
if (!entry.isDirectory() && name.startsWith(parent) && name.endsWith(".class"))
addIfMatching(name);
}
} catch (IOException ioe) {
System.out.println("Could not search jar file '" + jarfile + "' for classes matching criteria: " + " due to an IOException");
}
}
public static void addIfMatching(String fqn) {
try {
String externalName = fqn.substring(0, fqn.indexOf('.')).replace('/', '.');
ClassLoader loader = ClassLoader.getSystemClassLoader();
/*
* if (log.isDebugEnabled()) { log.debug("Checking to see if class " +
* externalName + " matches criteria [" + test + "]"); }
*/
Class type = loader.loadClass(externalName);
System.out.println(type.getName());
} catch (Throwable t) {
System.out.println("Could not examine class '" + fqn + "' due to a " + t.getClass().getName() + " with message: " + t.getMessage());
}
}
分享到:
相关推荐
在这个"web_classloader_test.zip_web classloader"示例中,我们可能涉及到了一些关于Web应用中类加载机制的核心概念。下面将详细探讨这些知识点。 1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类...
1. `this.getClass().getResource("")`:获取当前类所在的目录路径,如`file:/D/workspace/jbpmtest3/bin/com/test/`。 2. `this.getClass().getResource("/")`:获取当前类路径的根路径,如`file:/D/workspace/...
package test.classloader; import java.io.*; import org.apache.log4j.Logger; public class MyClassLoader extends ClassLoader { private String baseDir; private static final Logger logger = Logger....
4. **Java代码**:在Java代码中使用`ClassLoader`的`setClassPath()`方法,但这通常不推荐,因为它可能影响其他库的加载。 在进行测试时,你需要创建自己的测试类,继承自`Test`或使用`TestDriver`,编写测试方法,...
在"Test"这个Demo程序中,可能包含了几种测试用例,用于演示不同ClassLoader如何加载类,以及它们之间的协作关系。例如,可能会创建自定义的ClassLoader子类,然后尝试加载一个类,观察加载顺序和结果。这些测试用例...
本classloader可以从ftp或本地系统中动态的加载jar,zip资源,当资源实时变动时classlader会自动重新加载,不需要应用重新启动。样例: 加载ftp上某个目录下的所有jar,zip资源。 SingleClassLoader loader = new ...
包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager; / ** @作者坦克 @date:2015...
Class<?> testClass = classLoader.loadClass("com.example.Test"); // 可以进一步实例化这个类,调用其方法等 Object instance = testClass.newInstance(); Method method = testClass.getMethod("run"); ...
重新载入Java 支持类重载的ClassLoader的简单实现运行示例构建项目开始示例 gradle buildjava -cp build/classes/test/:build/libs/reload-java-1.0.jar reload.ReloadExample1该应用程序将等待输入,输入r + 已加载...
一个 JUnit 测试运行器,它在单独的ClassLoader中加载测试类和可选的指定类。 这意味着静态成员将在每个测试类之间有效地重置,因为这些类的新版本被加载。 Maven 依赖 < groupId>com.binarytweed</ groupId> ...
"引导程序Test.zip"可能是一个包含特定引导加载程序的压缩文件,用于测试或教学目的。在这个场景中,我们主要关注的是与Java相关的引导程序知识,因为标签为"java"。 Java引导程序(Bootstrap ClassLoader)是Java...
在 Java 中,有两种方式可以获取文件路径,即使用 Class.getResourceAsStream() 和 ClassLoader.getResourceAsStream()。 Class.getResourceAsStream() Class.getResourceAsStream() 方法返回的是一个 InputStream...
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader()); Class<?> c = cl.loadClass("com.qihoo360.test.Test"); ... } ``` 2. **...
但运行时抛出了`SecurityException`,原因在于`Test`类是由不同的ClassLoader加载的,而不是启动类加载器,因此无法访问由启动类加载器加载的`java.lang.String`类的私有构造函数。 在Java中,只有由同一个...
Java默认提供了一些ClassLoader,如`Bootstrap ClassLoader`、`Extension ClassLoader`和`Application ClassLoader`。开发者也可以通过继承`ClassLoader`类来自定义自己的类加载器,实现特定的需求。 #### 三、示例...
VirtualFile testFile = home.getChild("test.txt"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("/home/test.txt"); ...
@Test public void testClassLoader1() throws ClassNotFoundException, IOException { // 1. 获取系统的类加载器 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println("系统的类...
一种策略是创建与原类具有相同名称但带有版本信息的新类,例如 Test_v1.class 和 Test_v2.class。当类变更时,使用新的版本号加载更新的类。然而,JVM 不允许同一 ClassLoader 加载同名的不同类,因此需要借助 ASM...