eventsetdescriptor.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 441 行 · 第 1/2 页

JAVA
441
字号
			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 + =
减小字号Ctrl + -
显示快捷键?