Java 用类加载器don';我无法访问已更改的变量

Java 用类加载器don';我无法访问已更改的变量,java,methods,jar,classloader,invocation,Java,Methods,Jar,Classloader,Invocation,我有一个问题: 有一个从外部.java文件编译的类 私有静态类LoadedClass; 私有静态对象加载ClassInstance; 公共静态加载方法; [跳过] 专用静态路径编译器源(路径javaFile){ JavaCompiler=ToolProvider.getSystemJavaCompiler(); run(null,null,null,javaFile.toFile().getAbsolutePath()); 返回javaFile.getParent().resolve(“Load

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

私有静态类LoadedClass;
私有静态对象加载ClassInstance;
公共静态加载方法;
[跳过]
专用静态路径编译器源(路径javaFile){
JavaCompiler=ToolProvider.getSystemJavaCompiler();
run(null,null,null,javaFile.toFile().getAbsolutePath());
返回javaFile.getParent().resolve(“LoadedClass.class”);
}
私有静态void运行类(路径javaClass)
抛出畸形的DurException、ClassNotFoundException、IllegalAccessException、InstanceionException、IllegalArgumentException、InvocationTargetException、NoSuchMethodException、SecurityException{
URL classUrl=javaClass.getParent().toFile().toURI().toul();
URLClassLoader=URLClassLoader.newInstance(新URL[]{classUrl});
LoadedClass=Class.forName(“LoadedClass”,true,classLoader);
在这个类中有一个方法:

LoadedClassInstance=LoadedClass.getDeclaredConstructor().newInstance();
LoadedMethod=LoadedClass.getDeclaredMethod(“DoTheMethod”);
}
下面是一个调用已加载方法的静态方法:

public static void CallLoadedMethod()抛出IllegaAccessException、IllegalArgumentException、InvocationTargetException{
调用(LoadedClassInstance);
}
Loaded方法调用另一个方法:

导入MyApp.MyClass1;
[跳过]
公共静态void DoTheMethod(){
System.out.println(“您的号码是:“+MyClass1.number”);
}
我还有两门课要上:

//MyClass1
公共静态整数=5;
公共课MyClass1{
//多索米斯塔夫
}
//MyClass2
公共类MyClass2{
公共静态无效设置number to(整数){
MyClass1.编号=编号;
System.out.println(“您的新号码是:“+MyClass1.number”);
}
}
以下是加载的方法调用示例:

MyClass2.将编号设置为(10);
Class_Loader.DoTheMethod();
当我通过Eclipse运行我的应用程序时,我得到:

你的新号码是:10

你的电话号码是:10

但当我将其编译为runnable.jar时,我得到了另一个结果:

你的新号码是:10

你的电话号码是:5


问题是:我做错了什么?

如果两个类对象具有相同的名称和相同的类加载器,那么它们是相同的。您加载了两个不同的类,每个类的名称为
MyClass1


classu加载器中的
MyClass1.Number
与主程序类加载器中从MyClass2调用的
MyClass1.Number
不同。它们不在同一个字段中,因为它们不在同一个类中。

那么,我能做些什么来解决这个问题呢?为什么我通过Eclipse运行它时,一切都像预期的那样工作呢?我怀疑Eclipse在其Java运行时中有自己的类加载器,它们以不同的方式解析类。至于修复它,您可以尝试,其中父级是
MyClass2.class.getClassLoader()
Tryed
URLClassLoader classLoader=URLClassLoader.newInstance(新URL[]{classUrl},MyClass2.class.getClassLoader())这很有帮助。但是
System.out.println(MyClass2.class.getClassLoader().toString())给出
java.net。URLClassLoader@2812cbfa
System.out.println(LoadedClass.class.getClassLoader().toString())给出
java.net。FactoryURLClassLoader@7a95b7d3
。威奇看起来不一样。