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

Reply via email to