背景:
我有一个MainTest类,它有许多按钮,每个按钮都实例化我正在编码/测试的类.我希望这些类的代码/测试周期快速,并且快速查看我的更改的效果,每分钟几次.稳定的MainTest大约需要20秒才能加载,如果我不需要为它实例化的类中的每次更改重新加载它,这不会成为问题.我想加载一次MainTest,当它实例化另一个类时,让我们多次调用它ChildTest(在按钮事件时),它应该重新加载最新版本的ChildTest.
简而言之:
如何告诉java'new'命令从磁盘而不是从jvm缓存重新加载类?
我尝试过Class.ForName但它并没有什么区别.
我也尝试过使用自定义类加载器(从开源复制),但无济于事.
我有一个工作代码,它动态加载具有不同类名的不同类实现。类文件被加载到内存数据库( Apache Derby Db ) 中,并且类加载器从BLOB列中检索.class文件。
我想要做的是,将.class文件作为带有版本列和IS_ENABLED标志的二进制 BLOB插入,然后类加载器将在运行时加载不同版本的类。将有相同数量的已编译类版本的 db 条目,并且只有一个类的IS_ENABLED标志设置为TRUE。
因为我尝试使用自定义类加载器加载相同的类名,所以我得到以下异常;
Exception in thread "main" java.lang.LinkageError: loader (instance of com/levent/classloader/DerbyServerClassLoader): attempted duplicate class definition for name: "com/levent/greeter/Greeter"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at com.levent.classloader.DerbyServerClassLoader.findClass(DerbyServerClassLoader.java:38)
at com.levent.example.ClientClassLoaderDBVersionDemo.main(ClientClassLoaderDBVersionDemo.java:43)
Run Code Online (Sandbox Code Playgroud)
同一个接口(Greeter.java)有两个不同的.class文件(Greeter.class.v1、Greeter.class.v2)(在代码开头插入)
在测试代码的开头,从 lib/classes/ 文件夹中检索类文件并将其作为 blob 二进制数据插入到内存数据库中,然后,.class 文件由数据库顺序检索并加载。加载同名类时,发生异常。
我怎么解决这个问题?有没有办法卸载一个类,或者无论如何重新加载一个同名的类?
package com.levent.classloader;
import java.sql.Blob; …Run Code Online (Sandbox Code Playgroud)