Mercurial Hosting > luan
changeset 1860:bcb015265c21 default tip
better uniqueClassLoader
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 18 Mar 2025 17:44:35 -0600 |
parents | d4f857a37961 |
children | |
files | src/goodjava/io/FileClassLoader.java src/luan/Luan.java src/luan/modules/JavaLuan.java |
diffstat | 3 files changed, 20 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
diff -r d4f857a37961 -r bcb015265c21 src/goodjava/io/FileClassLoader.java --- a/src/goodjava/io/FileClassLoader.java Tue Mar 18 15:38:31 2025 -0600 +++ b/src/goodjava/io/FileClassLoader.java Tue Mar 18 17:44:35 2025 -0600 @@ -24,14 +24,14 @@ this.checksum = IoUtils.checksum( new BufferedInputStream( new FileInputStream(file) ) ); } - public boolean equals(Object obj) { + @Override public boolean equals(Object obj) { if( !(obj instanceof FileInfo) ) return false; FileInfo fi = (FileInfo)obj; return this.checksum==fi.checksum && this.file.getName().equals(fi.file.getName()); } - public int hashCode() { + @Override public int hashCode() { return (int)checksum; } }
diff -r d4f857a37961 -r bcb015265c21 src/luan/Luan.java --- a/src/luan/Luan.java Tue Mar 18 15:38:31 2025 -0600 +++ b/src/luan/Luan.java Tue Mar 18 17:44:35 2025 -0600 @@ -33,10 +33,15 @@ public final Map rootRegistry; // synchronize access private final Map localOnly = new HashMap(); + private static String clName(boolean uniqueClassLoader) { + return uniqueClassLoader ? "Luan.classLoader_unique" : "Luan.classLoader_shared"; + } + public Luan() { this.registry = new HashMap(); this.rootRegistry = new HashMap(); - rootRegistry.put("Luan.classLoader",emptyClassLoader); + rootRegistry.put(clName(false),emptyClassLoader); + rootRegistry.put(clName(true),emptyClassLoader); } public Luan(Luan luan) { @@ -482,16 +487,23 @@ // jars - public ClassLoader getClassLoader() { + public Class loadClass(String name) throws ClassNotFoundException { synchronized(rootRegistry) { - return (FileClassLoader)rootRegistry.get("Luan.classLoader"); + FileClassLoader classLoader = (FileClassLoader)rootRegistry.get(clName(false)); + try { + return classLoader.loadClass(name); + } catch(ClassNotFoundException e) { + classLoader = (FileClassLoader)rootRegistry.get(clName(true)); + return classLoader.loadClass(name); + } } } public void addJar(File jar,boolean uniqueClassLoader) throws IOException { FileClassLoader.FileInfo file = new FileClassLoader.FileInfo(jar); synchronized(rootRegistry) { - FileClassLoader classLoader = (FileClassLoader)rootRegistry.get("Luan.classLoader"); + String clName = clName(uniqueClassLoader); + FileClassLoader classLoader = (FileClassLoader)rootRegistry.get(clName); List<FileClassLoader.FileInfo> files = classLoader.getFiles(); if( files.contains(file) ) return; @@ -501,7 +513,7 @@ } else { classLoader = FileClassLoader.getFileClassLoader(files); } - rootRegistry.put("Luan.classLoader",classLoader); + rootRegistry.put(clName,classLoader); } }
diff -r d4f857a37961 -r bcb015265c21 src/luan/modules/JavaLuan.java --- a/src/luan/modules/JavaLuan.java Tue Mar 18 15:38:31 2025 -0600 +++ b/src/luan/modules/JavaLuan.java Tue Mar 18 17:44:35 2025 -0600 @@ -348,7 +348,7 @@ cls = Thread.currentThread().getContextClassLoader().loadClass(name); } catch(ClassNotFoundException e2) { try { - cls = luan.getClassLoader().loadClass(name); + cls = luan.loadClass(name); } catch(ClassNotFoundException e3) { return null; }