Tag: classloader

如何在Java中卸载已加载的类?

如何从类加载器中卸载一个类,以便我可以动态使用最近更改的类而无需重新启动我的应用程序(热部署)? 有可能吗?

如何在java中运行正在运行的应用程序中的类?

假设我有一个名为NameGenerator的类。 我可以使用它根据给定的逻辑生成名称。 然后我用一个方法编写一个TestNameGeneration类,该方法要求用户写一封信并按照生成名称。 现在我想更改NameGeneration类中的逻辑并应用该特定更改而不停止应用程序。 我这样做是为了更多地了解类加载器,有人可以解释一下我必须学习做的事情或网站任何参考的关键概念吗?

如果不使用返回值,Class.forName()的用途是什么?

我在示例应用程序中看到了使用商业JDBC驱动程序的这一行: Class.forName(“name.of.a.jcdb.driver”) 不使用返回值。 这条线的目的是什么?

Java:为什么打包到jar文件中的代码会阻止外部类访问?

我的Java应用程序有一个插件系统。 我使用URL类加载器调用外部类。 当我的应用程序作为类文件运行时,以及当我的应用程序处于JARforms时,该部分运行良好。 我遇到的问题是,插件文件可以运行他们自己的独立代码,但他们创建了一个JPanel。 当我尝试将JPanel添加到主应用程序类中的JPanel时,我得到一个引用主类的空指针exception。 (com.cpcookieman.app.Main)但是,如果我运行应用程序的类文件,只有在打包时才会发生这种情况。 我怎么解决这个问题? 为什么我的代码打包到jar文件中会阻止外部类访问jar中的类? 编辑:根据要求,堆栈跟踪。 java.lang.NullPointerException at TestPlugin2.Main.(Main.java:23) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at com.cpcookieman.ph.PluginLoader$2.run(PluginLoader.java:74) at java.lang.Thread.run(Unknown Source) 编辑2:类加载代码 String pluginsPath; if (Main.os.equals(“Windows”)) { pluginsPath = “C:\\plugins\\”; } else { pluginsPath = “~/plugins/”; } File file = new […]

ClassLoader getResourceAsStream返回null

我的项目目录结构(在Eclipse中): MyProject/ src/ –> “source directory” on Eclipse’s classpath/buildpath com.me.myapp Driver myconfig.txt 在Driver ,我有以下代码: public class Driver { public static void main(String[] args) { InputStream is = ClassLoader.getSystemClassLoader.getResourceAsStream(“myconfig.txt”); if(is == null) System.out.println(“input stream is null”); else System.out.println(“input stream is NOT null :-)”); } } 当我运行这个时,我得到以下控制台输出: input stream is null 为什么? 我是否将myconfig.txt放在了错误的位置? 我是否错误地使用了ClassLoader API? 别的什么? 提前致谢!

因为类加载器而导致ClassCastException?

在使用类加载器时,我遇到以下exception: Exception in thread “main” java.lang.ClassCastException: xxx.Singleton cannot be cast to xxx.Singleton 这是否意味着类加载器中的实例不能转换为另一个类加载器的类? 检查我的代码,我可以通过类加载器实现3个单例,即使是“”安全性。 public static void main(String[] args) throws Exception { URL basePath = new URL(“file:/myMavenPath/target/classes/”); Object instance = getClassInstance(Singleton.class); System.out.println(instance); // Object instance2 = getClassInstance( new URLClassLoader( new URL[]{basePath} , null ) .loadClass(“my.Singleton”) ); System.out.println(instance2); // Object instance3 = getClassInstance( new URLClassLoader( new […]

由于ClassLoader问题导致ClassCastException的解决方案

我有两个ClassLoader加载相同的类。 所以,显然这些不能相互投射。 但是我需要访问在另一个ClassLoader中创建的对象。 我可以访问两个ClassLoader。 如何在其他类中使用该对象? 我不需要将对象转换为与当前ClassLoader匹配。 但问题是返回的对象的类型是Object 。 所以,我必须抛弃该对象来访问某些方法。 我怎样才能做到这一点? 像下面这样的正常转换会导致ClassCastException,我已经知道了。 Mojo mojo = (Mojo) descriptor.getMojo(); descriptor#getMojo()返回Mojo类型的对象,但该方法返回Object 。 怎么办呢? 如果您需要更多信息,请告诉我。 我已经阅读了关于类加载的所有理论,但没有一个为此指定了适当的解决方案。

有没有办法让ClassLoader加载哪些类?

我正在尝试为旧框架实现一些unit testing。 我试图模拟出数据库层。 不幸的是,我们的框架有点陈旧,并没有完全采用最佳实践,因此没有明确的关注点分离。 我有点担心尝试模拟数据库层可能会使JVM加载大量甚至无法使用的类。 我不太了解类加载器,所以这可能不是问题。 有没有办法在特定的ClassLoader加载的所有类中达到峰值,以certificate引擎盖下发生了什么?

来自远程目录的Java Class.forName()

我目前正在使用Class.forName()加载Java类来加载它。 clazz = Class.forName(“interfaces.MyClass”); 但是现在我想从不同的目录加载类,我试图设置classpath clazz = Class.forName(“-cp \”C:/dir\” distantinterfaces.DistantClass”); 没有成功和ClassNotFoundException 。 远程class级的完整路径是: C:/dir/distantinterfaces/DistantClass.class

Java:如何将存储为byte 的类加载到JVM中?

如果将整个.class文件序列化为byte [],并假设类的名称已知(与byte []一起传递),如何转换byte [] – > Class – >然后将其加载到JVM以便我以后可以通过调用Class.forName()来使用它? 注意:我这样做是因为我将.class发送到另一台主机,并且主机的JVM不知道这个.class。