如何在不面临依赖性问题的情况下从 JAR 调用方法? Java
How do I call a method from a JAR without facing a dependency issue? Java
示例:
这将存在于 JAR 中。
public class Foo {
public void saySomething() {
Log.d("Status","Got it!");
}
}
这将存在于我的 Main class。
public class Main {
public void tryToGetSomething() {
Foo.saySomething();
}
}
显然,问题是如果不包含 JAR,它会抛出错误。我该如何解决这个问题?我如何才能对其进行保护性编码,以便在包含 JAR 时执行此操作,但在不包含 JAR 时执行其他操作?
另外,抱歉,如果代码没有意义,几秒钟后就写好了。你应该明白了。
如果您尝试使用不存在的 class/method,将抛出 java.lang.NoClassDefFoundError
。在这种情况下,您可以捕获此错误并提供替代行为:
try {
Foo.saySomething();
} catch (NoClassDefFoundError e) {
System.out.println("Load the jar");
}
有趣的是,您将无法捕获同样抛出的 ClassNotFoundException
,因为它是已检查的异常。可能值得查看 this post 以详细了解它们之间的区别,以确保您正在解决相应的问题。
以下用于查找 Foo
class 并调用该方法的反射代码将起作用。未导入jar会出现异常,可以优雅处理。
try {
Class clazz = Class.forName("Foo");
Method method = clazz.getMethod("saySomething");
Object obj = clazz.newInstance();
method.invoke(obj);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
示例:
这将存在于 JAR 中。
public class Foo {
public void saySomething() {
Log.d("Status","Got it!");
}
}
这将存在于我的 Main class。
public class Main {
public void tryToGetSomething() {
Foo.saySomething();
}
}
显然,问题是如果不包含 JAR,它会抛出错误。我该如何解决这个问题?我如何才能对其进行保护性编码,以便在包含 JAR 时执行此操作,但在不包含 JAR 时执行其他操作?
另外,抱歉,如果代码没有意义,几秒钟后就写好了。你应该明白了。
如果您尝试使用不存在的 class/method,将抛出 java.lang.NoClassDefFoundError
。在这种情况下,您可以捕获此错误并提供替代行为:
try {
Foo.saySomething();
} catch (NoClassDefFoundError e) {
System.out.println("Load the jar");
}
有趣的是,您将无法捕获同样抛出的 ClassNotFoundException
,因为它是已检查的异常。可能值得查看 this post 以详细了解它们之间的区别,以确保您正在解决相应的问题。
以下用于查找 Foo
class 并调用该方法的反射代码将起作用。未导入jar会出现异常,可以优雅处理。
try {
Class clazz = Class.forName("Foo");
Method method = clazz.getMethod("saySomething");
Object obj = clazz.newInstance();
method.invoke(obj);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}