我有这个Java代码片段:
try {
Class.forName(command);
} catch (ClassNotFoundException ex) {
}
其中“command”是在运行时手动输入的String。为了问题,让我们假设用户输入“Foo”。
检查是否有名为Foo的类。检查后我想要做的是从Foo调用一个方法。
Foo.execute();
如果不为每个班级制作一个特殊的“if”案例,我该如何做到这一点?有没有办法使用别名,($ command).execute(),其中$命令(在这种情况下)我的Foo类?
答案 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)