【问题标题】:How to invoke method using reflection如何使用反射调用方法
【发布时间】:2018-02-18 11:23:15
【问题描述】:

Collections 类有嵌套类private static class EmptyList<E>,它有get(int index) 方法并且没有默认构造函数。如何调用get(int index) 方法?

【问题讨论】:

  • 您是否要创建EmptyList?如果是这样,请使用Collections.emptyList()。你为什么要在EmptyList 上调用get,它总是会抛出IndexOutOfBoundsException。
  • 您能否详细说明一下为什么要涉及一个每次调用都会引发IndexOutOfBoundsException 的方法?但是忽略这一点,您可以只调用 Collections.emptyList() 返回的实例上的方法。
  • 您的问题类似于X/Y problem。你为什么要在这里实现?
  • 我需要它来抛出 IndexOutOfBoundException。
  • 我的实际问题是有问题的。

标签: java reflection nested private invoke


【解决方案1】:

您可以使用下面的代码创建java.util.Collections$EmptyList 的实例并调用它的get(int)。该代码经过全面测试,并根据要求抛出IndexOutOfBoundsException。

import java.lang.reflect.Constructor;
import java.util.List;

public class Test {

    public static void main(String[] args) throws ReflectiveOperationException {
        Class<?> clazz = Class.forName("java.util.Collections$EmptyList");
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        constructor.setAccessible(true);
        List<?> emptyList = (List<?>) constructor.newInstance();

        emptyList.get(0);
    }
}

只是因为我很好奇,您能否提供更多信息说明您为什么要这样做?

【讨论】:

  • 我太笨了。我正在这样做List emptyList = (List) constructor.newInstance(); 我想要这样做,因为我学习 java 并且我有一个任务:找到具有给定描述的类。它实现了 List 接口。它是流行实用程序类中的私有静态嵌套类。索引访问被禁止,它会抛出 IndexOutOfBoundsException。使用反射找到合适的类。
  • 我又傻了,因为List emptyList = (List) constructor.newInstance(); 是这样工作的。这意味着我不记得有什么区别。
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 2011-01-13
相关资源
最近更新 更多