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 + -
显示快捷键?