reflection - 如何使用java反射从接口(interface)中找到 "default"方法?

标签 reflection java-8

我想查找一个方法是否为 “默认方法”通过java反射。我试过打印java.lang.Iterable的方法.

代码片段:

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectionTest {

public static void main(String[] args) {
    Class c = Iterable.class;

    for(Method m : c.getDeclaredMethods())
    {
        System.out.print(Modifier.toString(m.getModifiers()));
        System.out.println("  "+m.getName());
    }
  }
}

结果:
public abstract  iterator
public  spliterator
public  forEach

在这里, spliterator() 和 forEach() 应该打印了 default .
如果我的解释有误,请纠正我。

最佳答案

在最近版本的 java8 更新中,我们有 isDefault()java.lang.reflect.Method class ,这可以解决问题。
稍微修改我以前的代码会产生结果。

代码:

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectionTest {

  public static void main(String[] args) {
    Class c = Iterable.class;

    for(Method m : c.getDeclaredMethods())
    {
        System.out.print(Modifier.toString(m.getModifiers()));
        System.out.println("  "+(m.isDefault()?"default ":"")+m.getName());
    }
  }
}

输出:
public abstract  iterator
public  default spliterator
public  default forEach

注:我已经在 jdk8 update 20 中测试过了

关于reflection - 如何使用java反射从接口(interface)中找到 "default"方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25476449/

相关文章:

java - 检测不适用于通过反射调用的方法

java - 缩短带有 .contains 的 if 语句

java - 如何使用 Caffeine 缓存管理器测试内存缓存? (即在缓存、缓存驱逐后获取缓存中的条目数)

Java:从不同类加载器中的类调用方法

java - Tomcat 8 无法通过反射访问 protected 成员

c# - 在泛型集合中使用类型变量

c# - Type.GetType(string) 应该知道动态生成的类型吗?

java - 如何在 Spring 使用 EnableScheduling 注释在运行时重新启动计划任务?

java - Android Studio 错误 : Error:CreateProcess error=216, 此版本的 %1 与您运行的 Windows 版本不兼容

java - 避免在控制逻辑中使用 isPresent() 和 get()