On 06/15/2013 11:06 PM, Nick Williams wrote:
B) A Class loaded by a child class loader obtains a StackTraceElement
containing Classes loaded by a sibling class loader. This would obviously be
the more dangerous scenario (think: one web application accessing another web
application's classes), but I don't think it's actually possible. I don't think
a stack trace generated in one class loader can possibly make its way into code
in a sibling class loader, and I know that an execution stack can't contain
classes from two sibling class loaders (only from class loaders with
parent/child relationships).
Why not? Consider this hypothetical code:
Parent class loader:
public class A {
public static final A INSTANCE = new A();
final PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener
pcl) { pcs.addPropertyChangeListener(pcl); }
String property;
public void setProperty(String property) {
pcs.firePropertyChange("property", this.property,
this.property = property);
}
}
Child class loader 1:
static class B implements PropertyChangeListener {
B() {
A a = A.INSTANCE;
a.addPropertyChangeListener(this);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
StackTraceElement[] st = new Throwable().getStackTrace();
// can we see C.class in 'st' array?
}
}
Child class loader 2:
static class C {
void m() {
A a = A.INSTANCE;
a.setProperty("XYZ");
}
}
Regards, Peter