有没有办法让ClassLoader加载哪些类?
我正在尝试为旧框架实现一些unit testing。 我试图模拟出数据库层。 不幸的是,我们的框架有点陈旧,并没有完全采用最佳实践,因此没有明确的关注点分离。 我有点担心尝试模拟数据库层可能会使JVM加载大量甚至无法使用的类。
我不太了解类加载器,所以这可能不是问题。 有没有办法在特定的ClassLoader加载的所有类中达到峰值,以certificate引擎盖下发生了什么?
请注意使用
java -verbose
会产生大量的输出。 将输出记录到文件,然后使用grep。 如果你有’tee’filter,你可以试试这个:
java -verbose | tee classloader.log grep class classloader.log
您可以创建自己的类加载器,并在unit testing期间使用它加载。 让您自己的自定义Classloader打印出它正在做的事情。
或者,如果您只想知道加载了哪些类,请执行以下操作:
java -verbose:class
我不确定。 但有一种方法我认为可以做到。 虽然这可能太荒谬了。 您可以尝试方面并为loadclass设置切入点。 也许jvm参数-verbose可能有用。
作为替代方法,对于您提到的特定类加载器,您可以使用此代码段。 如果需要,只需更改obj变量的值即可。
Object obj = this; ClassLoader classLoader = obj.getClass().getClassLoader(); File file = new File("classloderClasses.txt"); if (file.exists()) { file.delete(); } if (classLoader != null) { try { Class clClass = classLoader.getClass(); while (clClass != ClassLoader.class) { clClass = clClass.getSuperclass(); } java.lang.reflect.Field classesField = clClass.getDeclaredField("classes"); classesField.setAccessible(true); Vector classes = (Vector) classesField.get(classLoader); FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true); fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes()); fos.write(Arrays.toString(classes.toArray()).getBytes()); fos.close(); } catch (Exception exception) { exception.printStackTrace(); // TODO } }
- 加载类和实例化它之间的区别
- this.getClass()。getClassLoader()。getResourceAsStream总是返回null
- 是否可以创建指向内存中对象的URL?
- URLClassLoader将Annotation加载为com.sun。$ Proxy $ 27
- Tomcat 6 vs 7 – lib vs shared / lib – jars only?
- 因为类加载器而导致ClassCastException?
- java程序启动时会发生什么?
- 在Eclipse中运行时加载资源时出现问题
- Java / JSF / Tomcat / Spring – Proxy-Object与原始对象有不同的方法