是否可以静态反映java方法?

时间:2012-11-25 19:25:30

标签: java reflection

有没有办法静态引用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)
}

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

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

2 个答案:

答案 0 :(得分:4)

Method references解释

  

此方法用于比较两个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.ConstructorField的类型安全的,编译时更改的实例:

// 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中提供。