gpt4 book ai didi

java - 调用匿名类的方法

转载 作者:IT老高 更新时间:2023-10-28 20:51:48 25 4
gpt4 key购买 nike

前几天我知道你可以做到这一点

new Object() {
void hello() {
System.out.println("Hello World!");
}
}.hello();

这对我来说真的很奇怪。确定创建的对象的静态类型是Object,所以没有方法hello()?这不是几乎完全没有意义吗(例如,不可能调用 hello 两次)。

我对此有 2 个问题。

  1. 谁能指出规范中解决这个问题的部分?
  2. 我认为调用 hello 的唯一方法是立即像这样。反射呢?

谢谢

最佳答案

Can somebody point me to the part of the specification that addresses this?

这将主要在有关 Method invocation expressions 的部分中定义。 :

The first step in processing a method invocation at compile time is to figure out the name of the method to be invoked and which class or interface to search for definitions of methods of that name.

For the class or interface to search, there are six cases to consider, depending on the form that precedes the left parenthesis of the MethodInvocation:

  • [...]
  • If the form is Primary . [TypeArguments] Identifier, then let T be the type of the Primary expression. The class or interface to search is T if T is a class or interface type, or the upper bound of T if T is a type variable.

这里,主表达式class instance creation expression .所以要搜索的类型是匿名类型。

Am I right in thinking that the only way you can invoke hello is immediately like this. What about reflection?

只要一个表达式的计算结果为匿名类型 T,无论是通过像您这样的直接访问还是通过泛型,您都可以访问(适用常规访问规则) 的成员T 声明。这不仅限于方法。您可以访问字段或类型,尽管它对类型没有那么有用。例如,

Object var = new Object() {
class Nested {
}
}.new Nested();

由于没有封闭类型就无法引用嵌套类型,因此您不能声明该嵌套类型的变量。有用性下降得很快。 (大概这也是为什么在这个匿名类中不能有 static 嵌套类型的原因。)

Reflection 也公开了这个方法。生成的匿名类包含此方法,因此您可以检索并调用它。过程是一样的。实例来自匿名类的事实并不重要。与 How do I invoke a Java method when given the method name as a string? 中提出的策略相同适用。

例如,

Object ref = new Object() {
public void method() {
System.out.println("hidden");
}
};
Class<?> anonymousClass = ref.getClass();
Method method = anonymousClass.getMethod("method");
method.invoke(ref, new Object[0]);

永远不要写这样的代码。

关于java - 调用匿名类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32959680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com