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

Java 从树上的特定类到对象并获取它们的方法(无需多次编写),java,class,class-hierarchy,Java,Class,Class Hierarchy,所以我有一个问题。直到明天早上我的任务是做一个java程序,它得到一个类,然后写它的名称和方法,然后得到它实现的那个,做同样的事情,然后继续到对象。问题是我必须做它,这样方法就不会重复它们自己。(只有添加该方法的类才应该打印出来,该类的实现不应该再拥有它。) 我做的,所以它只打印一次,但它打印出来非常奇怪。下面是代码: public static void main(String[] args) { Object o = new JRadioButton(); Class cl;

所以我有一个问题。直到明天早上我的任务是做一个java程序,它得到一个类,然后写它的名称和方法,然后得到它实现的那个,做同样的事情,然后继续到对象。问题是我必须做它,这样方法就不会重复它们自己。(只有添加该方法的类才应该打印出来,该类的实现不应该再拥有它。) 我做的,所以它只打印一次,但它打印出来非常奇怪。下面是代码:

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)
使用
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("=============================");
        }
    }
}

检查此代码是否正在运行。

使用
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("=============================");
        }
    }
}
检查正在运行的代码。

这为我解决了问题: m、 getDeclaringClass().equals(cl)

这为我带来了窍门:
m、 getDeclaringClass().equals(cl)

输出有什么问题?您的输出是什么样子的?它应该是什么样子的?不需要在循环中创建添加的所有内容都是在JRadioButton下打印出来的(这很有意义,因为所有的方法都表明它是一个实现)但是改为声明解决了我的问题!输出有什么问题?输出是什么样子的?它应该是什么样子的?没有必要在循环中创建添加的所有内容都是在JRadioButton下打印出来的(这很有意义,因为所有的方法都表明它是一个实现)但是换成一个医生解决了我的问题!