#156703: WeakListenerImpl: Can't remove java.beans.PropertyChangeListener using method
1.1 --- a/openide.util/src/org/openide/util/WeakListenerImpl.java Wed May 06 15:28:40 2009 +0200
1.2 +++ b/openide.util/src/org/openide/util/WeakListenerImpl.java Thu May 07 17:15:05 2009 +0200
1.3 @@ -145,6 +145,7 @@
1.4 return this;
1.5 }
1.6
1.7 + @Override
1.8 public String toString() {
1.9 Object listener = ref.get();
1.10
1.11 @@ -475,16 +476,19 @@
1.12
1.13 /** To string prints class.
1.14 */
1.15 + @Override
1.16 public String toString() {
1.17 return super.toString() + "[" + listenerClass + "]"; // NOI18N
1.18 }
1.19
1.20 /** Equal is extended to equal also with proxy object.
1.21 */
1.22 + @Override
1.23 public boolean equals(Object obj) {
1.24 return (proxy == obj) || (this == obj);
1.25 }
1.26
1.27 + @Override
1.28 Object getImplementator() {
1.29 return proxy;
1.30 }
1.31 @@ -523,9 +527,6 @@
1.32 }
1.33
1.34 public void run() {
1.35 - // prepare array for passing arguments to getMethod/invoke
1.36 - Object[] params = new Object[1];
1.37 - Class[] types = new Class[1];
1.38 Object src = null; // On whom we're listening
1.39 Method remove = null;
1.40
1.41 @@ -559,8 +560,10 @@
1.42
1.43 // get the remove method or use the last one
1.44 if (remove == null) {
1.45 - types[0] = ref.listenerClass;
1.46 - remove = getRemoveMethod(methodClass, methodName, types[0]);
1.47 + remove = getRemoveMethod(methodClass, methodName, new Class[]{ref.listenerClass});
1.48 + if (remove == null) {
1.49 + remove = getRemoveMethod(methodClass, methodName, new Class[]{String.class, ref.listenerClass});
1.50 + }
1.51
1.52 if (remove == null) {
1.53 LOG.warning(
1.54 @@ -579,10 +582,12 @@
1.55 }
1.56 }
1.57
1.58 - params[0] = ref.getImplementator(); // Whom to unregister
1.59 -
1.60 try {
1.61 - remove.invoke(src, params);
1.62 + if (remove.getParameterTypes().length == 1) {
1.63 + remove.invoke(src, new Object[]{ref.getImplementator()});
1.64 + } else {
1.65 + remove.invoke(src, new Object[]{null, ref.getImplementator()});
1.66 + }
1.67 } catch (Exception ex) { // from invoke(), should not happen
1.68 // #151415 - ignore exception from AbstractPreferences if node has been removed
1.69 if (!"removePreferenceChangeListener".equals(methodName) && !"removeNodeChangeListener".equals(methodName)) { //NOI18N
1.70 @@ -598,8 +603,7 @@
1.71 }
1.72
1.73 /* can return null */
1.74 - private Method getRemoveMethod(Class<?> methodClass, String methodName, Class listenerClass) {
1.75 - final Class<?>[] clarray = new Class<?>[] { listenerClass };
1.76 + private Method getRemoveMethod(Class<?> methodClass, String methodName, Class<?>[] clarray) {
1.77 Method m = null;
1.78
1.79 try {