相关疑难解决方法(0)

如何强制Java在实例化时重新加载类?

背景:
我有一个MainTest类,它有许多按钮,每个按钮都实例化我正在编码/测试的类.我希望这些类的代码/测试周期快速,并且快速查看我的更改的效果,每分钟几次.稳定的MainTest大约需要20秒才能加载,如果我不需要为它实例化的类中的每次更改重新加载它,这不会成为问题.我想加载一次MainTest,当它实例化另一个类时,让我们多次调用它ChildTest(在按钮事件时),它应该重新加载最新版本的ChildTest.

简而言之:
如何告诉java'new'命令从磁盘而不是从jvm缓存重新加载类?


我尝试过Class.ForName但它并没有什么区别.
我也尝试过使用自定义类加载器(从开源复制),但无济于事.

java constructor object

18
推荐指数
1
解决办法
2万
查看次数

使用同一类的不同版本进行类加载:java.lang.LinkageError:尝试为名称重复类定义

我有一个工作代码,它动态加载具有不同类名的不同类实现。类文件被加载到内存数据库( 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.v1Greeter.class.v2)(在代码开头插入

在测试代​​码的开头,从 lib/classes/ 文件夹中检索类文件并将其作为 blob 二进制数据插入到内存数据库中,然后,.class 文件由数据库顺序检索并加载。加载同名类时,发生异常。

我怎么解决这个问题?有没有办法卸载一个类,或者无论如何重新加载一个同名的类?

项目树

在此处输入图片说明

DerbyServerClassLoader.java - 类加载器

package com.levent.classloader;

import java.sql.Blob; …
Run Code Online (Sandbox Code Playgroud)

java jvm classloader linkageerror

6
推荐指数
2
解决办法
1万
查看次数

标签 统计

java ×2

classloader ×1

constructor ×1

jvm ×1

linkageerror ×1

object ×1