java - 使用 ClassLoader 加载的类无法访问已更改的变量

标签 java methods jar classloader invocation

我有一个问题: 有一个从外部 .java 文件编译的类

    private static Class<?> LoadedClass;
    private static Object LoadedClassInstance;
    public static Method LoadedMethod;

[SKIP]

   private static Path compileSource(Path javaFile) {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        compiler.run(null, null, null, javaFile.toFile().getAbsolutePath());
        return javaFile.getParent().resolve("LoadedClass.class");
    }

    private static void runClass(Path javaClass)
            throws MalformedURLException, ClassNotFoundException, IllegalAccessException, InstantiationException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
        URL classUrl = javaClass.getParent().toFile().toURI().toURL();
        URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{classUrl});
        LoadedClass = Class.forName("LoadedClass", true, classLoader);

这个类中有一个方法:

        LoadedClassInstance = LoadedClass.getDeclaredConstructor().newInstance(); 
        LoadedMethod = LoadedClass.getDeclaredMethod("DoTheMethod");                
    }

这是一个调用加载方法的静态方法:

    public static void CallLoadedMethod() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        LoadedMethod.invoke(LoadedClassInstance);   
    }

加载的方法调用另一个方法:

    import MyApp.MyClass1;
[SKIP]
    public static void DoTheMethod() {
        System.out.println("Your number is : "+MyClass1.Number);    
    }

我还有两个类(class)需要互动:

// MyClass1
    public static int Number = 5;
  public class MyClass1 {
    // DoSomeStuff
  }

// MyClass2
  public class MyClass2 {
    public static void SetTheNumberTo(int number){
        MyClass1.Number = number;
        System.out.println("Your NEW number is : "+MyClass1.Number);
    }
  }

这是 Loaded 方法调用示例:

    MyClass2.SetTheNumberTo(10);
    Class_Loader.DoTheMethod();

当我通过 Eclipse 运行我的应用程序时,我得到:

Your NEW number is : 10

Your number is : 10

但是当我将其编译为可运行的 .jar 时,我得到了另一个结果:

Your NEW number is : 10

Your number is : 5

问题是:我做错了什么?

最佳答案

如果两个类对象具有相同的名称和相同的 ClassLoader,则它们是相同的。您已经加载了两个不同的类,每个类都被命名为MyClass1

Class_Loader 中的

MyClass1.Number 与主程序 ClassLoader 中的 MyClass2 调用的 MyClass1.Number 不同。它们不是同一领域,因为它们不在同一类中。

关于java - 使用 ClassLoader 加载的类无法访问已更改的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59718164/

相关文章:

java - Netbeans 项目的两个主要类

java - 如何使用 maven 在 jar 编译中包含非 java 文件?

java - 在 Java 中转换为未绑定(bind)泛型

java - 无法启动 Play Framework 应用程序

ruby-on-rails - 从 Rake 文件中的任务调用方法

php - Yii2/PostgreSQL - 调用未知方法:yii\db\ActiveQuery::formName()

java - 如何将jar文件转换成apk?

java - 使用 action_view Intent 后 Android 应用程序崩溃

java - 如何使用 Java 中的正则表达式解析字符串的最后 6 位数字?

C#,编写更长的方法还是更短的方法?