Loading constraint is a new regulation since sun jdk 1.2.I use a test suit,
finding that there are some difference between harmony and sun jdk 1.5 about
the loading constraint. And I am not quite sure about the native resolution
of harmony. Who can help me to explain why???
There are two Spoofed.class. One is under the current direction, the other
is under the direction : greeters/ . They are different but with the same
name.
Spoofed.class
public class Spoofed {
private int secretValue = 42;
public int giveMeFive() {
return 5;
}
static {
System.out.println(
"linking/ex8/Spoofed initialized.");
}
}
greeters/Spoofed.class
public class Spoofed {
private int secretValue = 100;
public int giveMeFive() {
return secretValue;
}
static {
System.out.println(
"linking/ex8/greeters/Spoofed initialized.");
}
}
The method to invoke loading is as followed:
public void greet() {
Spoofed spoofed = new Spoofed();
System.out.println("secret val = "+ spoofed.giveMeFive());
spoofed = Delegated.getSpoofed();
System.out.println("secret val = "+ spoofed.giveMeFive());
}
In which the Delegated.class:
public class Delegated {
public static Spoofed getSpoofed() {
return new Spoofed();
}
}
Then we define the classloader to load the Spoofed.class in greeters. The
main function invokes greet().Results show as follows:
Result In sun jdk 1.5:
D:\linking\ex8>java Greet greeters Cracker
linking/ex8/greeters/Spoofed initialized.
secret val = 100
Exception in thread "main" java.lang.LinkageError: Class Spoofed violates
loader
constraints
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at Delegated.getSpoofed(Delegated.java:7)
at Cracker.greet(Cracker.java:13)
at Greet.main(Greet.java:39)
Result In harmony:
[EMAIL PROTECTED]:/trunk/target/hdk/jdk/jre/bin$ ./java Greet
greeters Cracker
linking/ex8/greeters/Spoofed initialized.
secret val = 100
linking/ex8/Spoofed initialized.
secret val = 5
[EMAIL PROTECTED]:/trunk/target/hdk/jdk/jre/bin$