Java: 加载用户定义的接口实现(来自配置文件)
Java: load User-defined interface implementation (from config file)
我需要允许用户通过配置文件在运行时指定接口的实现,类似于这个问题:Specify which implementation of Java interface to use in command line argument
然而,我的情况不同,因为在编译时实现是未知的,所以我将不得不使用反射来实例化class。我的问题是......我如何构建我的应用程序,以便我的 class 可以看到新实现的 .jar,以便它可以在我调用时加载 class:
Class.forName(fileObject.getClassName()).newInstance()
?
评论正确;只要 .jar 文件在您的 class 路径中,您就可以加载 class。
我以前用过这样的东西:
public static MyInterface loadMyInterface( String userClass ) throws Exception
{
// Load the defined class by the user if it implements our interface
if ( MyInterface.class.isAssignableFrom( Class.forName( userClass ) ) )
{
return (MyInterface) Class.forName( userClass ).newInstance();
}
throw new Exception("Class "+userClass+" does not implement "+MyInterface.class.getName() );
}
其中 String userClass
是配置文件中用户定义的 class 名称。
编辑
想想看,甚至可以加载用户在运行时指定的 class(例如,在上传新的 class 之后),使用如下方式:
public static void addToClassPath(String jarFile) throws IOException
{
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class loaderClass = URLClassLoader.class;
try {
Method method = loaderClass.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(classLoader, new Object[]{ new File(jarFile).toURL() });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException( t );
}
}
我记得在 SO 的某个地方找到了 addURL()
使用反射的调用(当然)。
我需要允许用户通过配置文件在运行时指定接口的实现,类似于这个问题:Specify which implementation of Java interface to use in command line argument
然而,我的情况不同,因为在编译时实现是未知的,所以我将不得不使用反射来实例化class。我的问题是......我如何构建我的应用程序,以便我的 class 可以看到新实现的 .jar,以便它可以在我调用时加载 class:
Class.forName(fileObject.getClassName()).newInstance()
?
评论正确;只要 .jar 文件在您的 class 路径中,您就可以加载 class。
我以前用过这样的东西:
public static MyInterface loadMyInterface( String userClass ) throws Exception
{
// Load the defined class by the user if it implements our interface
if ( MyInterface.class.isAssignableFrom( Class.forName( userClass ) ) )
{
return (MyInterface) Class.forName( userClass ).newInstance();
}
throw new Exception("Class "+userClass+" does not implement "+MyInterface.class.getName() );
}
其中 String userClass
是配置文件中用户定义的 class 名称。
编辑
想想看,甚至可以加载用户在运行时指定的 class(例如,在上传新的 class 之后),使用如下方式:
public static void addToClassPath(String jarFile) throws IOException
{
URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Class loaderClass = URLClassLoader.class;
try {
Method method = loaderClass.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(classLoader, new Object[]{ new File(jarFile).toURL() });
} catch (Throwable t) {
t.printStackTrace();
throw new IOException( t );
}
}
我记得在 SO 的某个地方找到了 addURL()
使用反射的调用(当然)。