diff --git a/src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java b/src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java index 94ef4ee0bb4e117f090cbeebbf565b691628cc70..8f634b5ee03e01987d1c6454cf7f21b4f0f235b7 100644 --- a/src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java +++ b/src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java @@ -16,16 +16,16 @@ import org.opennars.storage.Memory; * Exposes a method of a object as a callable operator */ public class MethodInvocationOperator extends Operator { - private Method method; - private Object object; - private List<Class> argumentTypes; + final private Method method; + final private Object object; + final private Class[] argumentTypes; /** * @param narsOperatorName name of the operator as called by NARS * @param object object of method call * @param method called method */ - public MethodInvocationOperator(final String narsOperatorName, final Object object, final Method method, final List<Class> argumentTypes) { + public MethodInvocationOperator(final String narsOperatorName, final Object object, final Method method, final Class[] argumentTypes) { super(narsOperatorName); this.object = object; @@ -36,16 +36,16 @@ public class MethodInvocationOperator extends Operator { @Override protected List<Task> execute(Operation operation, Term[] args, Memory memory, Timable time) { try { - if (argumentTypes.size() == 0) { + if (argumentTypes.length == 0) { method.invoke(object); } - else if (argumentTypes.size() == 1 && argumentTypes.get(0).equals(String.class) ) { + else if (argumentTypes.length == 1 && argumentTypes[0].equals(String.class) ) { method.invoke(object, args[1].toString()); } - else if (argumentTypes.size() == 2 && argumentTypes.get(0).equals(String.class) && argumentTypes.get(1).equals(String.class) ) { + else if (argumentTypes.length == 2 && argumentTypes[0].equals(String.class) && argumentTypes[1].equals(String.class) ) { method.invoke(object, args[1].toString(), args[2].toString()); } - else if (argumentTypes.size() == 3 && argumentTypes.get(0).equals(String.class) && argumentTypes.get(1).equals(String.class) && argumentTypes.get(2).equals(String.class) ) { + else if (argumentTypes.length == 3 && argumentTypes[0].equals(String.class) && argumentTypes[1].equals(String.class) && argumentTypes[2].equals(String.class) ) { method.invoke(object, args[1].toString(), args[2].toString(), args[3].toString()); } else { diff --git a/src/main/java/org/opennars/middle/operatorreflection/OperatorReflection.java b/src/main/java/org/opennars/middle/operatorreflection/OperatorReflection.java index a2f3e3dd7a7078c92a7714992775e6ca90199dca..b88a6c0e54781a999c37e8d67f29d126b348c27a 100644 --- a/src/main/java/org/opennars/middle/operatorreflection/OperatorReflection.java +++ b/src/main/java/org/opennars/middle/operatorreflection/OperatorReflection.java @@ -30,7 +30,10 @@ public class OperatorReflection { * @param argumentTypes the types of the called method */ public void appendAndRegisterMethodWithoutArguments(final Pluggable pluggable, final String narsOperatorName, final Object object, final String methodName, final List<Class> argumentTypes) throws NoSuchMethodException { - Method calledMethod = retMethodByName(object, methodName); + Class[] argumentTypeArray = new Class[argumentTypes.size()]; + argumentTypeArray = argumentTypes.toArray(argumentTypeArray); + + Method calledMethod = retMethodByName(object, methodName, argumentTypeArray); MethodInvocationOperator operator = new MethodInvocationOperator(narsOperatorName, object, calledMethod, argumentTypes); @@ -40,7 +43,7 @@ public class OperatorReflection { methodOperators.put(narsOperatorName, operator); } - protected Method retMethodByName(final Object object, final String methodName) throws NoSuchMethodException { - return object.getClass().getMethod(methodName); + protected Method retMethodByName(final Object object, final String methodName, final Class[] argumentTypes) throws NoSuchMethodException { + return object.getClass().getMethod(methodName, argumentTypes); } }