9

有没有办法静态引用 Java 中的反射方法。这是一些示例代码,可让您了解我正在尝试的内容:

public void myFunc(int x) { ... }

public void other() {
    Method m1 = getClass().getMethod("myFunc");  // dynamic
    Method m2 = this.myFunc;                     // static
    Method m3 = MyClass.myFunc;                  // static (alternate)
}

我认识到上面的语法不起作用,但我想知道是否有某种与此类似的语法实际上起作用。我想要一种使用反射的方法,而不必担心通过字符串引用方法的内在危险。

有没有办法做到这一点,还是只是一个白日梦?

4

2 回答 2

3

方法参考说明

这种比较两个 Person 实例的出生日期的方法已经存在于Person.compareByAge. 您可以在 lambda 表达式的主体中调用此方法:

Arrays.sort(rosterAsArray,
    (a, b) -> Person.compareByAge(a, b)
);

因为这个 lambda 表达式调用了一个现有的方法,所以您可以使用 > 方法引用而不是 lambda 表达式:

Arrays.sort(rosterAsArray, Person::compareByAge);

并继续解释各种方法引用:

有四种方法引用:

Reference to a static method      ContainingClass::staticMethodName

Reference to an instance method
of a particular object            containingObject::instanceMethodName

Reference to an instance method   ContainingType::methodName
of an arbitrary object of a
particular type

Reference to a constructor        ClassName::new

历史记录(在 Java 8 完成之前编写)

我认为 Java 闭包提案有这样的内容。 斯蒂芬科尔伯恩说:

Stefan 和我很高兴地宣布发布第一类方法 v0.4:Java 风格的闭包提案。

变化

从 v0.3 开始,我们尝试整合在各个论坛上收到的一些反馈。主要变化如下:

1) 构造函数和字段文字。现在可以使用 FCM 语法创建类型安全java.lang.reflect.Constructor、编译时更改的实例:Field

// method literal:
Method m = Integer#valueOf(int);

// constructor literal:
Constructor<Integer> c = Integer#(int);

// field literal:
Field f = Integer#MAX_VALUE;

但我认为这种语法在任何出货的 JVM 中都不可用。闭包本身绝对不在 Java 7 中。您可能会在 Java 8 中看到它。

Java 闭包站点有一个指向“方法引用”的指针,虽然看起来它们并没有对语法进行太多更改,但它有点更新。

于 2012-11-25T20:00:31.480 回答
-2

JSR-335是您正在寻找的。希望它将在 JDK 8 中可用。

于 2012-11-25T20:02:17.543 回答