【问题标题】:Passing a class as an argument to a method in java将类作为参数传递给java中的方法
【发布时间】:2013-01-28 14:29:18
【问题描述】:

我正在编写一个方法,我想将一个类传递给一个方法,其中一部分代码包括检查对象是否属于某种类型。这就是我想要的(但显然不起作用):

private static class MyClass1 { /***/ }
private static class MyClass2 { /***/ }

private void someFunc() {
    /* some code */
    methodName(MyClass1);
    methodName(MyClass2);
}


private void methodName(Class myClass) {
    Object obj;
    /* Complicated code to find obj in datastructure */
    if (obj instanceof myClass) {
        /* Do stuff */
    }
}

关于如何做到这一点的任何提示?谢谢!

【问题讨论】:

    标签: java argument-passing instanceof


    【解决方案1】:
    MyClass1 myClass1 = new MyClass1();
    if(MyClass1.class.isInstance(myClass1))
        System.out.println("(MyClass1.class.isInstance(myClass1) is TRUE");
    else
        System.out.println("(MyClass1.class.isInstance(myClass1) is FALSE");
    
    Object myClass2 = new MyClass2();
    Class class1 = myClass1.getClass(); 
    Class class2 = myClass2.getClass();
    System.out.println("class1 == class2 : " + ( class1 == class2));
    System.out.println("class1.isAssignableFrom(class2) = " 
        + class1.isAssignableFrom(class2));
    
    MyClass1 myClass3 = new MyClass1();
    Class class3 = myClass3.getClass();
    System.out.println("class1 == class3 : " + ( class1 == class3));
    System.out.println("class1.isAssignableFrom(class3) = " 
        + class1.isAssignableFrom(class3));
    
    OUPUT:
    
    (MyClass1.class.isInstance(myClass1) is TRUE
    class1 == class2 : false
    class1.isAssignableFrom(class2) = false
    class1 == class3 : true
    class1.isAssignableFrom(class3) = true
    

    【讨论】:

      【解决方案2】:

      我想你想在运行时知道对象的类类型.. 所以使用反射API。对于您的问题,我认为此解决方案可行

      public class Clazz {
      public static void main(String[] args) {
          Clazz clazz = new Clazz();
          ArrayList list = new ArrayList<>();
          Class myClass = list.getClass();
          clazz.display(myClass);
      }
      
      /**
       * Modified By nirav.modi on Feb 13, 2013
       */
      private void display(Class myClass) {
          ArrayList list = new ArrayList<>();
          if(myClass.isInstance(list)) {
              System.out.println("Yooo , its instance..");
          }else {
              System.out.println("Not instance");
          }
      }
      

      }

      【讨论】:

        【解决方案3】:

        Class 有一个 isInstance() 方法和一个 isAssignableFrom() 方法来检查类似的东西。最接近您正在寻找的是:

        if (myClass.isInstance(obj)) {
        

        更新:从您的评论中,您希望将类的名称传递给方法并检查是否可以将某些内容分配给该类。唯一的方法是将类名作为字符串传递,然后加载类并使用上述方法之一。例如(省略异常处理):

        private void methodName(String className) {
            Class myClass = Class.forName(className);
            Object obj;
            /* Complicated code to find obj in datastructure */
            if (myClass.isInstance(obj)) {
                /* Do stuff */
            }
        }
        

        【讨论】:

        • 我认为我的问题表述不够清楚 - 问题是我希望能够使用 instanceof,即我希望传递的“类”是类的名称.
        • 已更新。这是否更接近您的目标?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 2018-12-11
        • 1970-01-01
        相关资源
        最近更新 更多