如果类存在,则调用构造函数

时间:2015-11-20 20:23:56

标签: java class methods alias

我有这个Java代码片段:

try {
    Class.forName(command);
} catch (ClassNotFoundException ex) {    
}

其中“command”是在运行时手动输入的String。为了问题,让我们假设用户输入“Foo”。

检查是否有名为Foo的类。检查后我想要做的是从Foo调用一个方法。

Foo.execute();

如果不为每个班级制作一个特殊的“if”案例,我该如何做到这一点?有没有办法使用别名,($ command).execute(),其中$命令(在这种情况下)我的Foo类?

4 个答案:

答案 0 :(得分:2)

我的第一直觉是你希望能够从名字中执行的任何一个类,就是让每个人都实现一个共同的接口。

示例:

Sub cemg()

Dim fRow As Long
Dim lRow As Long

With ActiveSheet

    lRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    fRow = lRow - 12

    .Range(.Cells(fRow, 1), .Cells(lRow, 6)).Copy 'change 6 to the number of columns you have
    .Cells(lRow + 2, 1).PasteSpecial

End With

End Sub

如何调用:

public Interface InputClazz {
    public void execute();
}

public class Foo implements InputClazz {
  public void execute() {
    //do Stuff
  }
}

public class Bar implements InputClazz {
  public void execute() {
    //do Stuff
  }
}

然后您可以输入Foo或Bar,代码将运行该类的具体执行方法。

答案 1 :(得分:0)

您必须使用这样的反射和调用方法:

Object o = m.invoke(t, new Locale(args[1], args[2], args[3]));

有关详细信息,请参阅本教程:https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html

答案 2 :(得分:0)

打印“Hello World”

private static void call(String className, String methodName) {
    try {
        Class<?> clazz = Class.forName(className);
        Object instance = clazz.newInstance();
        Method method = clazz.getMethod(methodName);
        method.invoke(instance);
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
}

static class Foo {
    public void foo() {
        System.out.println("Hello World");
    }
}

public static void main(String[] args) {
    call(Foo.class.getName(), "foo");
}

唯一不那么好的是你必须使用完全限定的类名。因此,Foo代替com.mycompany.something.Foo而不是{{1}}。或者你真的必须确保这些类没有包。

答案 3 :(得分:0)

我认为Nappa有一个很好的,实用的答案。如果您想成为一名小伙伴,可以使用isAssignableFrom()方法Class检查您的班级是否为成员资格。

下面的代码使用内置层次结构(StringBuilder实现CharSequence接口)。当它找到类型CharSequence的类时,它会强制转换类,然后在其上调用length()

您可以保持对类类型的控制,而不会抛出异常,这在某些情况下可能会更加清晰。

请注意,如果您拼写错误的类名称,此代码仍会抛出ClassNotFoundExcpetion。你仍然必须抓住那个例外。

public class ReflectionSubclassing
{

   public static void main(String[] args) 
           throws ClassNotFoundException, InstantiationException, 
           IllegalAccessException 
   {
      getDoubleValue( "java.lang.StringBuilder" );
      getDoubleValue( "javax.swing.JButton" );
   }

   private static void getDoubleValue( String className ) 
           throws ClassNotFoundException, InstantiationException, 
           IllegalAccessException
   {
      Class<?> tempClass = Class.forName( className );
      if( java.lang.CharSequence.class.isAssignableFrom( tempClass ) ) {
         Object charSeq = tempClass.newInstance();
         CharSequence cs = (java.lang.CharSequence)charSeq;
         System.out.println( cs.length() );
      } else
         System.out.println( "nope" );
   }
}

示例代码输出:

run:
0
nope
BUILD SUCCESSFUL (total time: 0 seconds)