to:zqrqq 我参照sun.com网站写了一个代码,其结果是在同一个JVM中不同的classloader载入类的静态变量只有一个copy,而且只有一个类对象。 另外classloader的职责是将类的定义从文件载入内存,如果一个类定义已经被载入到内存,不太明白为什么另外一个classloader还要做相同的动作?代码如下: import java.io.File; import java.net.URL; import java.net.URLClassLoader;class Bar { public static int n = 0; }public class Foo { public static void main(String[] args) throws Exception {
// XXXXXXXXXXXX: EDIT THIS LINE File classDirectory = new File("C:\\workspace\\foo\\");
// Create two Bars, one normal and one using reflection Bar bar1 = new Bar(); Bar bar2 = (Bar) Class.forName("Bar").newInstance(); // Create a new class loader with the default (system) class loader as a parent URL u = classDirectory.toURL(); URLClassLoader cl = new URLClassLoader( new URL[] {u} ); Class cls = cl.loadClass("Bar"); Object obj = cls.newInstance(); Bar bar3 = (Bar) obj; // This will say "true" System.out.println("bar1.getClass() == bar3.getClass(): " + (bar1.getClass() == bar3.getClass()) );
// Try to cast our classloaded object to a Bar. This will work. System.out.println("First cast works!"); System.out.println("bar1.n: " + bar1.n); System.out.println("bar2.n: " + bar2.n); System.out.println("bar3.n: " + bar3.n); bar1.n = 5; System.out.println("bar1.n: " + bar1.n); System.out.println("bar2.n: " + bar2.n); System.out.println("bar3.n: " + bar3.n); } }
入口是A.main,你把B里的main理解为一个普通的static方法就可以了
public static int i=0;
}比如说我在A类中改变C类的静态变量,C.i=1,并在A类中启动tomcat,那么在tomcat的servlet中调用C类的静态变量i还为0吗?
如果A,B类再调用第3方的类C时,C类的静态变量就是同一个.
类的静态变量会与classloader有关系吗?静态变量不是在jvm中只存在一个对象吗?
答案:有。如果classloader不一致,导致系统内可以存在两个class A(参见classloader)
我参照sun.com网站写了一个代码,其结果是在同一个JVM中不同的classloader载入类的静态变量只有一个copy,而且只有一个类对象。
另外classloader的职责是将类的定义从文件载入内存,如果一个类定义已经被载入到内存,不太明白为什么另外一个classloader还要做相同的动作?代码如下:
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;class Bar {
public static int n = 0;
}public class Foo {
public static void main(String[] args) throws Exception {
// XXXXXXXXXXXX: EDIT THIS LINE
File classDirectory = new File("C:\\workspace\\foo\\");
// Create two Bars, one normal and one using reflection
Bar bar1 = new Bar();
Bar bar2 = (Bar) Class.forName("Bar").newInstance(); // Create a new class loader with the default (system) class loader as a parent
URL u = classDirectory.toURL();
URLClassLoader cl = new URLClassLoader( new URL[] {u} );
Class cls = cl.loadClass("Bar");
Object obj = cls.newInstance();
Bar bar3 = (Bar) obj;
// This will say "true"
System.out.println("bar1.getClass() == bar3.getClass(): " + (bar1.getClass() == bar3.getClass()) );
// Try to cast our classloaded object to a Bar. This will work.
System.out.println("First cast works!");
System.out.println("bar1.n: " + bar1.n);
System.out.println("bar2.n: " + bar2.n);
System.out.println("bar3.n: " + bar3.n);
bar1.n = 5;
System.out.println("bar1.n: " + bar1.n);
System.out.println("bar2.n: " + bar2.n);
System.out.println("bar3.n: " + bar3.n);
}
}
这个问题实在不是一下子能解释清除的!
这句话是对的
但是,不能忽略了“不正常”的情况!
>>>classloader与静态变量的值有关感觉有些不太严谨
我来解释一下:
如果classloader1和classloader2都载入了class A,这时系统内会同时存在两个class A,假设分别是A' 和A'',他们的初始化i都是0,之后,A'的static变量i被修改为1,但是A''的static变量i依然是0
BTW:谢谢你的回复