从一个特定的 class 树向上到 Object 并获取它们的方法(它们不会被多次写入)

Going from a specific class up the tree to Object and getting their methods(without them being written more than once)

所以我有一个problem.My任务,直到明天要制作一个java程序,得到一个class,然后写下它的名称和方法,然后得到它实现,做同样的事情并继续直到 Object.The 问题是我必须做到这一点,这样方法就不会重复自己。(只有添加方法的 class 应该打印出来,实现class 不应该再有它了。) 我做到了,所以它只打印一次,但打印出来很奇怪。这是代码:

public static void main(String[] args) {
    Object o = new JRadioButton();
    Class cl;
    HashSet methodsnames = new HashSet();

    for (cl = o.getClass(); cl != null; cl = cl.getSuperclass()) {
       HashSet al = new HashSet();
       System.out.println(cl.getName()+ " - ");
       for (Method m : cl.getMethods()){
           boolean added = methodsnames.add(m.getName());
           if(added){
           al.add(m.getName());}
        }
       al.forEach(System.out::println);

        System.out.println("=============================");
    }
}

使用 Class#getMethods 你可以获得 class 的所有 public 方法 - 甚至是它的 super-class.[=12 提供的 public 方法=]

我认为只有当 class 也提供了实现时你才想打印方法,所以你需要检查声明 class: m.getDeclaringClass().equals(cl)

改用getDeclaredMethods getMethods:

import java.lang.*;
import java.lang.reflect.*;
import java.util.*;
import javax.swing.*;

public class main
{
    public static void main(String ...args) {
        Object o = new JRadioButton();
        Class cl;
        HashSet methodsnames = new HashSet();

        for (cl = o.getClass(); cl != null; cl = cl.getSuperclass()) {
           HashSet al = new HashSet();
           System.out.println(cl.getName()+ " - ");
           for (Method m : cl.getDeclaredMethods()){
               boolean added = methodsnames.add(m.getName());
               if(added){
                   al.add(m.getName());
               }
           }
           al.forEach(System.out::println);

           System.out.println("=============================");
        }
    }
}

检查此代码在 Ideone 上运行。

这对我有用: m.getDeclaringClass().等于(cl)