📄 eventsetdescriptor.java
字号:
throw new IntrospectionException("Listener remove method throws exceptions."); } } /** Create a new EventSetDescriptor. ** This form of constructor allows you to explicitly say which methods do what, and ** no reflection is done by the EventSetDescriptor. The methods are, however, ** checked to ensure that they follow the rules set forth at the top of the class. ** @param eventSetName the programmatic name of the event set, generally starting ** with a lowercase letter (i.e. fooManChu instead of FooManChu). ** @param listenerType the class containing the listenerMethods. ** @param listenerMethodDescriptors the event firing methods. ** @param addListenerMethod the add listener method. ** @param removeListenerMethod the remove listener method. ** @exception IntrospectionException if the listenerType is not an EventListener, ** or any of the methods are invalid. **/ public EventSetDescriptor(String eventSetName, Class listenerType, MethodDescriptor[] listenerMethodDescriptors, Method addListenerMethod, Method removeListenerMethod) throws IntrospectionException { setName(eventSetName); if(!java.util.EventListener.class.isAssignableFrom(listenerType)) { throw new IntrospectionException("Listener type is not an EventListener."); } this.listenerMethodDescriptors = listenerMethodDescriptors; this.listenerMethods = new Method[listenerMethodDescriptors.length]; for(int i=0;i<this.listenerMethodDescriptors.length;i++) { this.listenerMethods[i] = this.listenerMethodDescriptors[i].getMethod(); } this.addListenerMethod = addListenerMethod; this.removeListenerMethod = removeListenerMethod; this.listenerType = listenerType; checkMethods(); checkAddListenerUnicast(); if(this.removeListenerMethod.getExceptionTypes().length > 0) { throw new IntrospectionException("Listener remove method throws exceptions."); } } /** Get the class that contains the event firing methods. **/ public Class getListenerType() { return listenerType; } /** Get the event firing methods. **/ public Method[] getListenerMethods() { return listenerMethods; } /** Get the event firing methods as MethodDescriptors. **/ public MethodDescriptor[] getListenerMethodDescriptors() { if(listenerMethodDescriptors == null) { listenerMethodDescriptors = new MethodDescriptor[listenerMethods.length]; for(int i=0;i<listenerMethods.length;i++) { listenerMethodDescriptors[i] = new MethodDescriptor(listenerMethods[i]); } } return listenerMethodDescriptors; } /** Get the add listener method. **/ public Method getAddListenerMethod() { return addListenerMethod; } /** Get the remove listener method. **/ public Method getRemoveListenerMethod() { return removeListenerMethod; } /** Set whether or not multiple listeners may be added. ** @param unicast whether or not multiple listeners may be added. **/ public void setUnicast(boolean unicast) { this.unicast = unicast; } /** Get whether or not multiple listeners may be added. (Defaults to false.) **/ public boolean isUnicast() { return unicast; } /** Set whether or not this is in the default event set. ** @param inDefaultEventSet whether this is in the default event set. **/ public void setInDefaultEventSet(boolean inDefaultEventSet) { this.inDefaultEventSet = inDefaultEventSet; } /** Get whether or not this is in the default event set. (Defaults to true.)**/ public boolean isInDefaultEventSet() { return inDefaultEventSet; } private void checkAddListenerUnicast() throws IntrospectionException { Class[] addListenerExceptions = this.addListenerMethod.getExceptionTypes(); if(addListenerExceptions.length > 1) { throw new IntrospectionException("Listener add method throws too many exceptions."); } else if(addListenerExceptions.length == 1 && !java.util.TooManyListenersException.class.isAssignableFrom(addListenerExceptions[0])) { throw new IntrospectionException("Listener add method throws too many exceptions."); } } private void checkMethods() throws IntrospectionException { if(!addListenerMethod.getDeclaringClass().isAssignableFrom(removeListenerMethod.getDeclaringClass()) && !removeListenerMethod.getDeclaringClass().isAssignableFrom(addListenerMethod.getDeclaringClass())) { throw new IntrospectionException("add and remove listener methods do not come from the same class. This is bad."); } if(!addListenerMethod.getReturnType().equals(java.lang.Void.TYPE) || addListenerMethod.getParameterTypes().length != 1 || !listenerType.equals(addListenerMethod.getParameterTypes()[0]) || !Modifier.isPublic(addListenerMethod.getModifiers())) { throw new IntrospectionException("Add Listener Method invalid."); } if(!removeListenerMethod.getReturnType().equals(java.lang.Void.TYPE) || removeListenerMethod.getParameterTypes().length != 1 || !listenerType.equals(removeListenerMethod.getParameterTypes()[0]) || removeListenerMethod.getExceptionTypes().length > 0 || !Modifier.isPublic(removeListenerMethod.getModifiers())) { throw new IntrospectionException("Remove Listener Method invalid."); } for(int i=0;i<listenerMethods.length;i++) { if(!listenerMethods[i].getReturnType().equals(java.lang.Void.TYPE) || Modifier.isPrivate(listenerMethods[i].getModifiers())) { throw new IntrospectionException("Event Method " + listenerMethods[i].getName() + " non-void or private."); } if(!listenerMethods[i].getDeclaringClass().isAssignableFrom(listenerType)) { throw new IntrospectionException("Event Method " + listenerMethods[i].getName() + " not from class " + listenerType.getName()); } } } private void findMethods(Class eventSourceClass, Class listenerType, String listenerMethodNames[], String addListenerMethodName, String removeListenerMethodName, String absurdEventClassCheckName) throws IntrospectionException { /* Find add listener method and remove listener method. */ Class[] listenerArgList = new Class[1]; listenerArgList[0] = listenerType; try { this.addListenerMethod = eventSourceClass.getMethod(addListenerMethodName,listenerArgList); } catch(SecurityException E) { throw new IntrospectionException("SecurityException trying to access method " + addListenerMethodName + "."); } catch(NoSuchMethodException E) { throw new IntrospectionException("Could not find method " + addListenerMethodName + "."); } if(this.addListenerMethod == null || !this.addListenerMethod.getReturnType().equals(java.lang.Void.TYPE)) { throw new IntrospectionException("Add listener method does not exist, is not public, or is not void."); } try { this.removeListenerMethod = eventSourceClass.getMethod(removeListenerMethodName,listenerArgList); } catch(SecurityException E) { throw new IntrospectionException("SecurityException trying to access method " + removeListenerMethodName + "."); } catch(NoSuchMethodException E) { throw new IntrospectionException("Could not find method " + removeListenerMethodName + "."); } if(this.removeListenerMethod == null || !this.removeListenerMethod.getReturnType().equals(java.lang.Void.TYPE)) { throw new IntrospectionException("Remove listener method does not exist, is not public, or is not void."); } /* Find the listener methods. */ Method[] methods; try { methods = ClassHelper.getAllMethods(listenerType); } catch(SecurityException E) { throw new IntrospectionException("Security: You cannot access fields in this class."); } Vector chosenMethods = new Vector(); boolean[] listenerMethodFound = new boolean[listenerMethodNames.length]; for(int i=0;i<methods.length;i++) { if(Modifier.isPrivate(methods[i].getModifiers())) { continue; } Method currentMethod = methods[i]; Class retval = currentMethod.getReturnType(); if(retval.equals(java.lang.Void.TYPE)) { for(int j=0;j<listenerMethodNames.length;j++) { if(currentMethod.getName().equals(listenerMethodNames[j]) && (absurdEventClassCheckName == null || (currentMethod.getParameterTypes().length == 1 && ((currentMethod.getParameterTypes()[0]).getName().equals(absurdEventClassCheckName) || (currentMethod.getParameterTypes()[0]).getName().endsWith("."+absurdEventClassCheckName) ) ) ) ) { chosenMethods.addElement(currentMethod); listenerMethodFound[j] = true; } } } } /* Make sure we found all the methods we were looking for. */ for(int i=0;i<listenerMethodFound.length;i++) { if(!listenerMethodFound[i]) { throw new IntrospectionException("Could not find event method " + listenerMethodNames[i]); } } /* Now that we've chosen the listener methods we want, store them. */ this.listenerMethods = new Method[chosenMethods.size()]; for(int i=0;i<chosenMethods.size();i++) { this.listenerMethods[i] = (Method)chosenMethods.elementAt(i); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -