From 4af56e3d166e33ddef9348054fe8975ed3a6f1a0 Mon Sep 17 00:00:00 2001 From: Bukkit/Spigot Date: Fri, 13 May 2011 01:57:00 +0100 Subject: [PATCH] Fixed java plugin class loader so it works with plugins that contain classes also present in other plugins. This also removes the changes from commit 1c4bde50bc12d130f6c8 which was added in order to fix this issue but wasn't ideal as it required plugins to be updated which isnt required with this fix By: stevenh --- .../bukkit/plugin/java/JavaPluginLoader.java | 3 +- .../bukkit/plugin/java/PluginClassLoader.java | 32 ++++++++++++------- .../plugin/java/annotations/DontExport.java | 16 ---------- 3 files changed, 21 insertions(+), 30 deletions(-) delete mode 100644 paper-api/src/main/java/org/bukkit/plugin/java/annotations/DontExport.java diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index 93eb0f2c04..f38b7d1f5b 100644 --- a/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/paper-api/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -27,7 +27,6 @@ import org.bukkit.event.vehicle.*; import org.bukkit.event.world.*; import org.bukkit.event.weather.*; import org.bukkit.plugin.*; -import org.bukkit.plugin.java.annotations.DontExport; import org.yaml.snakeyaml.error.YAMLException; /** @@ -218,7 +217,7 @@ public final class JavaPluginLoader implements PluginLoader { } public void setClass(final String name, final Class clazz) { - if ((!classes.containsKey(name)) && (clazz.getAnnotation(DontExport.class) != null)) { + if (!classes.containsKey(name)) { classes.put(name, clazz); } } diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java b/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java index f998e3098e..085b201209 100644 --- a/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java +++ b/paper-api/src/main/java/org/bukkit/plugin/java/PluginClassLoader.java @@ -25,27 +25,35 @@ public class PluginClassLoader extends URLClassLoader { } protected Class findClass(String name, boolean checkGlobal) throws ClassNotFoundException { + // We use the following load order: + // 1. Local first, this avoids IllegalAccessError exceptions for duplicate classes + // 2. Global cache second which prevents ClassCastException's apparently Class result = classes.get(name); - - if (result == null) { - if (checkGlobal) { - result = loader.getClassByName(name); - } - - if (result == null) { + if ( null == result ) { + try { result = super.findClass(name); - - if (result != null) { - loader.setClass(name, result); + classes.put(name, result); + loader.setClass(name, result); + } catch ( ClassNotFoundException e ) { + if ( checkGlobal ) { + result = loader.getClassByName(name); + if ( null == result ) { + // We really couldnt find it + throw new ClassNotFoundException(name); + } + } else { + throw e; // no more options just rethrow } } - - classes.put(name, result); } + // NOTE: setClass already does a not exists check + loader.setClass(name, result); + return result; } + public Set getClasses() { return classes.keySet(); } diff --git a/paper-api/src/main/java/org/bukkit/plugin/java/annotations/DontExport.java b/paper-api/src/main/java/org/bukkit/plugin/java/annotations/DontExport.java deleted file mode 100644 index dd6efb9bea..0000000000 --- a/paper-api/src/main/java/org/bukkit/plugin/java/annotations/DontExport.java +++ /dev/null @@ -1,16 +0,0 @@ - -package org.bukkit.plugin.java.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Flags a class as private and not to be exported with other plugins - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.RUNTIME) -public @interface DontExport { - -}