java - 编写 Java 库以有条件地处理输入类而不会导致对该类的无条件运行时依赖

标签 java jar dependencies classpath instanceof

我有一个看起来很棘手的 Java 库任务。

如果 JTableJXTable,我需要编写一个适配器/帮助程序类来处理 JTable,它具有一些附加功能。 .但我不想在 swingx-core-1.6.2.jar 上添加运行时依赖项除非我的应用程序实际上使用了 JXTable(在这种情况下,它已经需要在类路径中包含 SwingX jar 文件)

我怎样才能解耦我的代码来完成这个?我什至不知道如何测试 JXTable;如果我尝试使用 instanceof JXTable 作为测试,这意味着我的代码已经对 JXTable 具有无条件的运行时依赖性。

我之前编写过具有“可选”运行时链接依赖项的 Java 库:如果我的库中有这个:

package com.foobar.foolib;

// import from whizbang.jar
import com.whizbang.BloatwareThingy;

public class SuperObject
{
    /* ... uses a BloatwareThingy ... */
}

并且 SuperObject 是唯一使用 whizbang.jar 的类,那么只要我的最终应用程序不使用 SuperObject,那么就没有对 whizbang 的运行时依赖性。 jar ;如果我的最终应用程序确实想要使用 SuperObject,那么它需要在类路径中包含 whizbang.jar。从应用程序的角度来看是可选的。效果很好。

如果应用程序仅使用 JTable,我如何编写方法来测试给定的 JTable 是 JXTable 的实例,而不需要依赖 SwingX jar 文件?

最佳答案

你可以测试:

Class cls = null;
try {
    cls = Class.forName( "org.jdesktop.swingx.JXTable" );
} catch( Throwable ex ) {}

if( cls != null )
    // have JXTable

之后,您将不得不专门使用反射来访问来自该外部库的类、方法、构造函数和字段。

因为如果您需要以这种方式访问​​大型 API,这会变得非常笨拙,您可以编写可以直接使用 JXTable 但通过反射创建并通过接口(interface)或抽象类调用的辅助类:

public interface MyTableHandler
{
    void doSomethingWithTable( JTable table );
}

public class JXTableHandler implements MyTableHandler
{
    void doSomethingWithTable( JTable table )
    {
        JXTable jxt = (JXTable) table;
        // use JXTable API directly ...
    }
}

public class StdTableHandler implements MyTableHandler
{
    void doSomethingWithTable( JTable table )
    {
        // do without JXTable
    }
}

public class MyIndependentClass
{
    static final MyTableHandler handler;

    static {
        try {
            Class.forName( "org.jdesktop.swingx.JXTable" ); // force exception
            handler = (MyTableHandler) Class.forName( "my.pkg.JXTableHelper" )
                                            .newInstance();
        } catch( Throwable ex ) {
            handler = new StdTableHandler();
        }
    }
    public void treatTable( JTable table )
    {
        handler.doSomethingWithTable( table );
    }
}

Java 虚拟机在类中使用不存在的 API 没有问题,这些类本身不使用但仅存在于 jar 文件中。使用这种方法,您将仅在 org.jdesktop.swingx.JXTable 可用时使用 JXTableHandler,否则使用 StdTableHandler。

关于java - 编写 Java 库以有条件地处理输入类而不会导致对该类的无条件运行时依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8358990/

相关文章:

java - AsyncTask 泄漏 : Robospice and AndroidAnnotations

java - 下载大文件太慢

java - 如何使用 FatJar (Gradle) 创建单个 jar

c++ - 将 OpenGL 依赖与客户端代码和服务器代码分开

Linux - 找不到依赖项 libmysqlclient.so.15

java - 扩展通用抽象类 : Correct Bounding

java - 在哪里可以找到异常列表以及异常发生的时间

java - 在eclipse中打包到jar

java - Eclipse : The type VertexNotFoundException could not be resolved. It is indirectly referenced from required .class files

java - gcm maven依赖错误