gpt4 book ai didi

java - 加载 java 类方法,文档与方法的行为不一致

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:22 26 4
gpt4 key购买 nike

所以我在 jdk 7 上运行了这两个类:

abstract class Aclass
{
public void foo()
{
}
public void bar()
{
}
}

和:

public class Bclass extends Aclass
{
public void foo(Integer one)
{
}
public void bar(String two)
{
}
}

我的目标是加载 Bclass,并且仅加载 Bclass,打印出其声明的方法和那些声明的方法的参数。这是我使用的代码:

public static void main(String[] args)
{
try
{
Class<?> clazz = Tester.class.getClassLoader().loadClass("full_path.Bclass");
for (Method method : clazz.getDeclaredMethods())
{
System.out.println("Method name: " + method.getName() + " From class: " + method.getDeclaringClass().getCanonicalName() + " with declared methods:");// test
for (Class<?> param : method.getParameterTypes())
{
System.out.println(param.getCanonicalName());
}
}
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}

运行此代码会产生以下输出:

Method name: foo From class: complete_path.Bclass with declared methods:
Method name: foo From class: complete_path.Bclass with declared methods:
java.lang.Integer
Method name: bar From class: complete_path.Bclass with declared methods:
Method name: bar From class: complete_path.Bclass with declared methods:
java.lang.String

但在方法 [getDeclaredMethods()] 的 javadoc 中,我看到 but excludes inherited methods ,根据我的测试,情况似乎并非如此,该方法显然确实加载了继承的方法,当它们重载。还是我做错了什么?

最佳答案

My goal is to load Bclass, and Bclass ONLY ...

这是不可能的。

JVM 规范 ( Chapter 5 ) 非常详细地解释了加载类时必须发生的情况。必须发生的事情之一是解析对直接父类(super class)和接口(interface)的引用。这需要加载相应的类/接口(interface)。

如果(出于某种原因)无法加载父类(super class)或接口(interface),则子类加载失败。


Loading java class methods, docs not consistent with method's behavior

getDeclaredMethods() 的意外行为是一个不同的问题。它与类加载无关。

根据此问答 - Problem in the GetDeclaredMethods (java) - 您会看到已添加到 Bclass 的合成“桥接”方法,而不是从 Aclass 继承的方法。

Java 教程中描述了桥接方法 here .

您可以使用 javap Bclass 查看 Bclass.class 中的代码来确认这一点。在输出中查看那些额外的桥接方法。

[steve@newbox tmp]$ javap Bclass
Compiled from "Bclass.java"
public class Bclass extends Aclass {
public Bclass();
public void foo(java.lang.Integer);
public void bar(java.lang.String);
public void bar();
public void foo();
}

可以通过为每个 Method 对象打印 method.isBridge() 来进一步确认(如果您需要)。

现在我不明白为什么这个代码需要桥接方法...但它们就是这样。


总而言之:您看到的 getDeclaredMethods 的行为 与 javadoc 一致。您所看到的是最近 Java 实现的一个鲜为人知(但已记录!)方面的结果。

关于java - 加载 java 类方法,文档与方法的行为不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28189907/

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