【问题标题】:Is there a way to know if a field extends java.awt.Component?有没有办法知道一个字段是否扩展了 java.awt.Component?
【发布时间】:2012-03-28 08:06:19
【问题描述】:

我正在使用反射来获取类的声明字段。现在我只需要选择那些 UI 组件,例如 JLabel、JFrame 等。有没有办法能够确定特定类型是否扩展了 java.awt.Compoenent?

我确实设法获得了该字段的通用类型,但是我需要能够确定该字段是否扩展组件

【问题讨论】:

  • isinstance?我猜你的意思是instanceof
  • @Ademiban,当然。只是与python混淆。谢谢。

标签: java swing reflection field


【解决方案1】:

你可以使用Class#isAssignableFrom

【讨论】:

    【解决方案2】:

    我已经写了一个例子来说明如何做到这一点。 在下面找到正在调查的类:

    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.JWindow;
    
    public class Foo {
       int i;
       long j;
       String s;
       JTable table;
       JLabel label;
       JWindow window;
     }
    

    这里是检查这个类的字段的代码:

    import java.lang.reflect.Field;
    
    public class Test {
       public static void main(String[] args) {
          new Test().run();
    }
    
    private void run() {
       Class<?> c = Foo.class;
       System.out.println("The following fields extend Component: ");
       for (Field f : c.getDeclaredFields()) {
          Class<?> fieldClass = f.getType();
          Class<java.awt.Component> compClass = java.awt.Component.class;      
          if (compClass.isAssignableFrom(fieldClass)) {
             System.out.println(f.getName());
          }
       }
     }
    }
    

    输出:

    以下字段扩展了组件: 桌子 标签 窗户

    【讨论】:

      【解决方案3】:

      应该这样做:

      <Object instance>.getClass().isAssignableFrom(Component.class);
      

      【讨论】:

        【解决方案4】:

        yourField instanceof java.awt.Component

        【讨论】:

          【解决方案5】:

          如果你已经在使用反射,你可以使用Class.isAssignableFrom()

          【讨论】:

            猜你喜欢
            • 2019-11-17
            • 2023-03-03
            • 1970-01-01
            • 2021-05-01
            • 2019-03-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多