1 package com.eviware.soapui.support; 2 3 import java.beans.PropertyChangeEvent; 4 import java.beans.PropertyChangeListener; 5 import java.lang.ref.WeakReference; 6 import java.lang.reflect.Method; 7 8 public class WeakPropertyChangeListener implements PropertyChangeListener 9 { 10 WeakReference<?> listenerRef; 11 Object src; 12 13 @SuppressWarnings( "unchecked" ) 14 public WeakPropertyChangeListener( PropertyChangeListener listener, Object src ) 15 { 16 listenerRef = new WeakReference( listener ); 17 this.src = src; 18 } 19 20 public void propertyChange( PropertyChangeEvent evt ) 21 { 22 PropertyChangeListener listener = ( PropertyChangeListener )listenerRef.get(); 23 if( listener == null ) 24 { 25 removeListener(); 26 } 27 else 28 listener.propertyChange( evt ); 29 } 30 31 private void removeListener() 32 { 33 try 34 { 35 Method method = src.getClass().getMethod( "removePropertyChangeListener", 36 new Class[] { PropertyChangeListener.class } ); 37 method.invoke( src, new Object[] { this } ); 38 } 39 catch( Exception e ) 40 { 41 e.printStackTrace(); 42 } 43 } 44 }