如何使用反射来区分类重载方法,例如:
<代码>方法()和<代码>方法(int-arg)
void invoke(Object object, String methodName, int id) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
object.getClass().getDeclaredMethod(methodName).invoke(object, int.class);
}
并调用此函数:
getV(new Object(), "method", 33);
它返回错误java.lang.IllegalArgumentException:错误数量的参数
,这意味着默认情况下选择没有参数的方法。如果我调用没有int参数的方法,它将工作。我问如何区分重载的方法?我已经阅读了Class.getDeclaredMethod
的文档https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html还有一个关于SO的旧帖子,但两个来源都没有回答相同的问题如何在Java中找到重载的方法?。当然类。对象没有名称方法的方法,我只是在示例中使用它。
必须为查找方法而不是invoke方法指定参数类型:
void invoke(Object object, String methodName, int id) throws ReflectiveOperationException {
object.getClass().getDeclaredMethod(methodName, int.class).invoke(object, id);
}
但是请记住,getClass()
返回实际的类,它可能是预期类的子类,而getDeclaredMethod
不分离超类。getMethod
确实搜索超类,但只考虑public
方法。
要考虑类型层次结构中的非公共方法,当找不到方法时,您必须自己循环超类。
要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要
为了能够 动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getConstructors() getConstructor(Class<?>…parameterTypes) getDeclaredConstructors() getDeclaredConstructor(Class<?>...parameterTypes) 如果是访问指定的构造方法,需要根据该构
问题内容: 这是一个测试类: 这是我的输出: 我缺少通过反射使注释可见的什么? 我是否仅需要检查它们的存在就需要注释处理器? 问题答案: 为了在运行时访问注释,它需要具有运行时的保留策略。 否则,注释将被丢弃,并且JVM无法识别它们。 有关更多信息,请参见此处。
问题内容: 只是玩弄Java反射,我想我大部分时间都掌握了它。我从这个问题/答案中了解到,在大多数情况下,我仅限于静态变量。如果我有该类的实例,则可以访问非静态变量,这确实有意义,我得到了很多。 说我有以下两节课: 我知道如何访问,这不是问题。我的理解是,我能得到的同样的方式(即)。从其他研究(javadocs,trails等)中,我收集到需要一个实例才能获得的值。 所以我的问题; 由于是静态的,
通过下列任意一个方法访问成员变量时将返回 Field 类型的对象或数组。 getFields() getField(String name) getDeclaredFields() getDeclaredField(String name) 上述方法返回的 Field 对象代表一个成员变量。例如,要访问一个名称为 price 的成员变量,示例代码如下: Field 类的常用方法如表 1 所示 表1
问题内容: 我试图使用反射获取不可见类的实例,即AKA包私有类。我想知道是否有一种方法可以切换修饰符以使其公开,然后使用进行访问。当我现在尝试尝试时,它会阻止我说我做不到。不幸的是,没有该类的方法。 问题答案: 嵌套类 -在其他类(包括静态和非静态类)中定义的类 内部类 -非静态嵌套类(内部类的实例需要外部类的实例存在) 非嵌套(顶级)类 根据您的问题,我们知道您要访问的构造函数不是公共的。因此您