// $Id: ReflectiveInvoker.java,v 1.2 2005/03/05 18:37:41 Dave Exp $
/*
* MainInvoker.java
* Copyright (C) 2005 David Clausen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later
* version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package net.dclausen.util;
import java.lang.reflect.*;
/**
* Runnable
which reflectively invokes a given static method.
* The class is not initialized until the run()
method is called.
* This is used by UncaughtExceptionLogger
.
*
* @see UncaughtExceptionLogger
*/
class ReflectiveInvoker implements Runnable {
private final String className;
private final String methodName;
private final Class[] argTypes;
private final Object[] args;
ReflectiveInvoker(String className, String methodName,
Class[] argTypes, Object[] args) {
this.className = className;
this.methodName = methodName;
this.argTypes = argTypes;
this.args = args;
}
/**
* Initialize the class named by className
and call the static
* method defined by methodName
and argTypes
,
* passing args
as the arguments.
*/
public void run() {
try {
Class cls = Class.forName(className);
Method method = cls.getMethod(methodName, argTypes);
try {
method.invoke(null, args);
} catch (InvocationTargetException e) {
throw e.getCause();
}
} catch (Throwable e) {
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
} else if (e instanceof Error) {
throw (Error) e;
} else {
throw new RuntimeException(e);
}
}
}
}