从树上的特定类转到 Object 并获取它们的方法(无需多次编写它们)

  • 本文关键字:方法 获取 Object java class class-hierarchy
  • 更新时间 :
  • 英文 :


所以我有一个问题。直到tommorw,我的主张是制作一个Java程序,它得到一个类,然后编写它的名称和方法,然后得到它实现的那个,做同样的事情并继续到Object.问题是我必须这样做,以便方法不会重复。(只有添加该方法的类才能将其打印出来,该类的实现不应再具有它。我做了它,所以它只打印一次所有内容,但它打印出来非常奇怪。这是代码:

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,你就可以得到类的所有公共方法 - 甚至是它的超类提供的公共方法。

我认为只有当类也提供实现时,您才想打印该方法,因此您需要检查声明类: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((.equals(cl(

最新更新