`
ytzhsh
  • 浏览: 9507 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

ClassLoader Test

    博客分类:
  • JAVA
 
阅读更多
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_classloader_test.zip_web classloader"示例中,我们可能涉及到了一些关于Web应用中类加载机制的核心概念。下面将详细探讨这些知识点。 1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类...

    java classloader classpath 张孝祥

    1. `this.getClass().getResource("")`:获取当前类所在的目录路径,如`file:/D/workspace/jbpmtest3/bin/com/test/`。 2. `this.getClass().getResource("/")`:获取当前类路径的根路径,如`file:/D/workspace/...

    java自定义类加载classloader文档,包括代码

    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....

    编译好的com.bruceeckel.simpletest类文件

    4. **Java代码**:在Java代码中使用`ClassLoader`的`setClassPath()`方法,但这通常不推荐,因为它可能影响其他库的加载。 在进行测试时,你需要创建自己的测试类,继承自`Test`或使用`TestDriver`,编写测试方法,...

    测试普通Java程序ClassLoader等级关系的Demo程序

    在"Test"这个Demo程序中,可能包含了几种测试用例,用于演示不同ClassLoader如何加载类,以及它们之间的协作关系。例如,可能会创建自定义的ClassLoader子类,然后尝试加载一个类,观察加载顺序和结果。这些测试用例...

    Jar classLoader

    本classloader可以从ftp或本地系统中动态的加载jar,zip资源,当资源实时变动时classlader会自动重新加载,不需要应用重新启动。样例: 加载ftp上某个目录下的所有jar,zip资源。 SingleClassLoader loader = new ...

    ClassLoader:ClassLoader动态加载类

    包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager; / ** @作者坦克 @date:2015...

    使用URLClassLoader加载本地文件夹c盘下的test.jar文件

    Class&lt;?&gt; testClass = classLoader.loadClass("com.example.Test"); // 可以进一步实例化这个类,调用其方法等 Object instance = testClass.newInstance(); Method method = testClass.getMethod("run"); ...

    reload-java:在Java 8中尝试使用ClassLoader

    重新载入Java 支持类重载的ClassLoader的简单实现运行示例构建项目开始示例 gradle buildjava -cp build/classes/test/:build/libs/reload-java-1.0.jar reload.ReloadExample1该应用程序将等待输入,输入r + 已加载...

    quarantining-test-runner:JUnit Runner 在单独的 ClassLoader 中加载指定的类,这在依赖于使用静态成员的第三方框架时会很方便

    一个 JUnit 测试运行器,它在单独的ClassLoader中加载测试类和可选的指定类。 这意味着静态成员将在每个测试类之间有效地重置,因为这些类的新版本被加载。 Maven 依赖 &lt; groupId&gt;com.binarytweed&lt;/ groupId&gt; ...

    引导程序Test.zip

    "引导程序Test.zip"可能是一个包含特定引导加载程序的压缩文件,用于测试或教学目的。在这个场景中,我们主要关注的是与Java相关的引导程序知识,因为标签为"java"。 Java引导程序(Bootstrap ClassLoader)是Java...

    Java文件路径详解

    在 Java 中,有两种方式可以获取文件路径,即使用 Class.getResourceAsStream() 和 ClassLoader.getResourceAsStream()。 Class.getResourceAsStream() Class.getResourceAsStream() 方法返回的是一个 InputStream...

    Android App 如何动态加载类.doc

    DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader()); Class&lt;?&gt; c = cl.loadClass("com.qihoo360.test.Test"); ... } ``` 2. **...

    java 类加载器 class loader

    但运行时抛出了`SecurityException`,原因在于`Test`类是由不同的ClassLoader加载的,而不是启动类加载器,因此无法访问由启动类加载器加载的`java.lang.String`类的私有构造函数。 在Java中,只有由同一个...

    JAVA文件中调用已编译的.CLASS的类.doc

    Java默认提供了一些ClassLoader,如`Bootstrap ClassLoader`、`Extension ClassLoader`和`Application ClassLoader`。开发者也可以通过继承`ClassLoader`类来自定义自己的类加载器,实现特定的需求。 #### 三、示例...

    spring源代码

    VirtualFile testFile = home.getChild("test.txt"); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); Resource[] resources = resolver.getResources("/home/test.txt"); ...

    java类加载器

    @Test public void testClassLoader1() throws ClassNotFoundException, IOException { // 1. 获取系统的类加载器 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println("系统的类...

    深入探索 Java 热部署

    一种策略是创建与原类具有相同名称但带有版本信息的新类,例如 Test_v1.class 和 Test_v2.class。当类变更时,使用新的版本号加载更新的类。然而,JVM 不允许同一 ClassLoader 加载同名的不同类,因此需要借助 ASM...

Global site tag (gtag.js) - Google Analytics