在Java中,可以将一行代码作为方法参数?

时间:2014-03-05 03:08:01

标签: java reflection methods arguments

我似乎无法在谷歌上找到任何东西,我不确定它是否可行。我想要做的是将一行Java代码作为参数传递给方法。 Google只会将cmd行参数传递给方法,但我希望传递一行实际的代码。

基本上我想将methodA传递给methodB,但methodA不是方法,而是一行代码。下面是将方法传递给使用反射的方法的完整示例。

public class Relation<T> {

protected Set<Pair<T,T>> pairs = null;

public Relation() {
    this.pairs = new LinkedHashSet<Pair<T,T>>();
}

    /* Next 2 methods are methods for sending methods to methods useing java.lang.reflect.Method */
    public Method getMethod(String name) {
        try {   return Relation.class.getDeclaredMethod(name);
        } catch (Exception e) {} 
        return null;
    }

    public boolean execute(Method method, Object... params) {
        try {   return (Boolean) method.invoke(this, params);
        } catch (Exception e) {}
        return false;
    }

    /* The method I reuse several times so I just put methods inside of it */   
    public boolean pairsTFIterator(Method method)  {
        for(Pair<T,T> x : pairs) {
            boolean bool = false;
            for(Pair<T,T> y : pairs) {
                if(execute(method, x,y))    
                    bool = true; break;
            }
            if(!bool) return false;
        }
        return true;
    }

    /* To be replaced by the line of code*/   
    public static <T> boolean isSymmetricPairs(Pair<T,T> a, Pair<T,T> b) {
        return a.getFirst().equals(b.getSecond()) && a.getSecond().equals(b.getFirst()) ? true :false;
    }

    /* Method that calls others */
    public boolean isSymmetric() {
        return pairsTFIterator(getMethod("isSymmetricPairs"));
    }
}

以上工作正常,但是我想更进一步,只是放弃像“isSymmetricPairs”方法这样的方法,只需将那些方法逻辑行直接放在“pairsTFIterator”中,就像这样:

public boolean isReflexive() {  
    return  baseSetTFIterator(
            a.getFirst().equals(b.getSecond()) && a.getSecond().equals(b.getFirst()) ? true :false
    );
}

我很确定这是不可能的,但如果有办法做到这一点,那就太好了。

2 个答案:

答案 0 :(得分:1)

听起来你正在寻找的是“一流的功能”。有些语言将函数看作变量,因为您可以将它们分配给变量并将它们作为参数传递给其他函数。 Java 8将引入lambda表达式的概念,它将支持这种类型的功能。

此外,还有其他JVM语言已经提供此功能,包括Scala和Groovy,以列出两个更受欢迎的语言。

为了让您了解它的样子,在Groovy中,您可以通过调用each()方法并向其传递一个闭包(本质上是一个函数)来对集合的每个元素执行任意函数。

def list = [1, 2, 3, 4]
def printer = { x -> println x } // defines a closure that takes one arg and prints it
list.each(printer) // prints out the elements

def sum = 0
def summer = { x -> sum += x } // defines a closure that takes one arg and adds it to the sum variable
list.each(summer)
println sum // should be 1 + 2 + 3 + 4

答案 1 :(得分:1)

将代码放入匿名内部类可满足您的要求:

    interface PairFilter<T>{
        boolean filter(Pair<T, T> a, Pair<T,T> b);
    }

在你的迭代器方法中:

    public boolean pairsTFIterator(PairFilter filter) {
        for(Pair<T,T> x : pairs) {
            boolean bool = false;
            for(Pair<T,T> y : pairs) {
                if(filter.filter(x,y))    
                    bool = true; break;
                }
                if(!bool) return false;
        }
        return true;
    }

然后调用它:

    pairsTFIterator(new PairFilter<T>(){
        public boolean filter(Pair<T, T> a, Pair<T,T> b){
            return a.getFirst().equals(b.getSecond()) && a.getSecond().equals(b.getFirst()) ? true :false;
        }
    });