有没有办法静态引用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)
}
我认识到上面的语法不起作用,但我想知道是否存在某种与此类似的语法实际上有效。我想要一种使用反射的方法,而不必担心通过字符串引用方法的固有危险。
有没有办法做到这一点,还是只是一个梦想?
答案 0 :(得分:4)
此方法用于比较两个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闭包提案有这样的东西。 Stephen Colebourne说:
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 closures site有一个指向"Method references"的指针,虽然它看起来并没有多大改变语法,但它有点更新了。
答案 1 :(得分:-2)
JSR-335是您正在寻找的。希望它将在JDK 8中提供。