/*
* Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package java.beans;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import com.sun.beans.finder.ClassFinder;
import com.sun.beans.finder.ConstructorFinder;
import com.sun.beans.finder.MethodFinder;
import sun.reflect.misc.MethodUtil;
/**
* A Statement
object represents a primitive statement
* in which a single method is applied to a target and
* a set of arguments - as in "a.setFoo(b)"
.
* Note that where this example uses names
* to denote the target and its argument, a statement
* object does not require a name space and is constructed with
* the values themselves.
* The statement object associates the named method
* with its environment as a simple set of values:
* the target and an array of argument values.
*
* @since 1.4
*
* @author Philip Milne
*/
public class Statement {
private static Object[] emptyArray = new Object[]{};
static ExceptionListener defaultExceptionListener = new ExceptionListener() {
public void exceptionThrown(Exception e) {
System.err.println(e);
// e.printStackTrace();
System.err.println("Continuing ...");
}
};
Object target;
String methodName;
Object[] arguments;
ClassLoader loader;
/**
* Creates a new Statement
object with a target
,
* methodName
and arguments
as per the parameters.
*
* @param target The target of this statement.
* @param methodName The methodName of this statement.
* @param arguments The arguments of this statement. If null
then an empty array will be used.
*
*/
@ConstructorProperties({"target", "methodName", "arguments"})
public Statement(Object target, String methodName, Object[] arguments) {
this.target = target;
this.methodName = methodName;
this.arguments = (arguments == null) ? emptyArray : arguments;
}
/**
* Returns the target of this statement.
*
* @return The target of this statement.
*/
public Object getTarget() {
return target;
}
/**
* Returns the name of the method.
*
* @return The name of the method.
*/
public String getMethodName() {
return methodName;
}
/**
* Returns the arguments of this statement.
*
* @return the arguments of this statement.
*/
public Object[] getArguments() {
return arguments;
}
/**
* The execute method finds a method whose name is the same
* as the methodName property, and invokes the method on
* the target.
*
* When the target's class defines many methods with the given name
* the implementation should choose the most specific method using
* the algorithm specified in the Java Language Specification
* (15.11). The dynamic class of the target and arguments are used
* in place of the compile-time type information and, like the
* java.lang.reflect.Method
class itself, conversion between
* primitive values and their associated wrapper classes is handled
* internally.
*
* The following method types are handled as special cases: *
Expression
s rather than Statement
s
* as they return a value.
* java.util.List
* interface may also be applied to array instances, mapping to
* the static methods of the same name in the Array
class.
*