给定实例的对象层次结构中所有类的完全限定名称

时间:2015-05-05 04:34:37

标签: java class object

如何在某个类中获取所有对象类。
例如:

class ex{
   Scanner in=new Scanner(System.in);
   void test(){
      String out=in.nextLine();
      JOptionPane.showMessageDialog(null,out);
   }
}

class ex2{
   void test(){
      java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
      String output=in.readLine();
   }
}

从这个班级我想打印出来

class ex :
java.util.Scanner
java.lang.String
javax.swing.JOptionPane

class ex2 :
java.io.BufferedReader
java.io.InputStreamReader
java.lang.String

3 个答案:

答案 0 :(得分:1)

一种可能的方法是从您自己的类中读取您自己的java类文件源,并列出您的java类中使用的所有类

答案 1 :(得分:1)

不可能,因为您尝试在实例的类中打印所有导入类的名称。考虑一些已导入到类文件的类,但该类的使用(导入的类)将在限制范围内。(private private修饰符指定只能访问该成员它自己的类。)除非你像阅读文本文件一样读取类文件并获取导入的类文件名。(这可能不是一个实际的解决方案)

如果您想要层次结构,可以执行以下操作。

JOptionPane.showMessageDialog(null,out.getClass());

More details

public static String printx(Object obj, String output){
    String str2 = new String(obj.getClass().toString());
    if(!str2.equalsIgnoreCase("class java.lang.Object") && !str2.equalsIgnoreCase("class java.lang.Class")){
        output += printx(obj.getClass().getSuperclass(),output);
    }
    output += (","+str2);
    return output;
}
public static void main(String[]args){
          Scanner c = new Scanner(System.in);
          String elzz = printx(c,"");
          elzz = elzz.substring(1);
          System.out.println(elzz);
}

答案 2 :(得分:1)

您可以使用ASM库来读取类文件。文档是here。你也可以谷歌一些例子。基本上你需要读取类常量池的Class条目。