7

在 Java 源代码中,我不想使用某些包。例如,我不想要任何对 swing、io 或其他的引用。

是否有系统可以在编译时或测试时进行检查?

例如,使用假定的注释

@NoPackage("javax.swing")
class Foo
{
    private JFrame fram; // NOT OK.
}

为什么我需要这个?因为我有一个带有swing 的应用程序,我想用一个使用swing 的部分重构它,而另一个不使用它的部分,因为我想将它移植到其他ui 的东西(web、pda 等)。

4

6 回答 6

3

我不知道这样的工具,但创建它并不复杂。对所有使用的类的引用都编码在类文件中。使用一些类文件库,可以检查类文件,并列出所有使用的类(或包)。如果插入了 @NoPaquage 之类的注释,那么该工具可以检查该类是否真的不使用该包。

于 2012-04-11T14:27:27.737 回答
2

我可以想到一种相当老套的方法来做到这一点。但是,您需要有一个此类禁止类的列表,而不仅仅是包。说,你想禁止使用javax.swing.JFrame.

只需创建下面的假类。

package javax.swing;

class JFrame {
}

请注意,该类不是公共的,因此任何导入它的尝试都会导致编译错误“ The type javax.swing.JFrame is not visible.

您可以从所有此类禁止的类中创建一个 JAR 文件,并确保它们最后由类加载器加载。这样可以确保肯定会发生编译器错误。每当您想运行此测试时,您都可以简单地选择包含/排除此 JAR 文件 - 如果使用 ant,这是一项微不足道的任务。

于 2012-04-11T14:20:11.723 回答
0

您可以在导入区域中选择要使用的包装。

在 Eclipse 中,您可以选择您的类来自哪个包。

您必须删除导入行才能选择另一个包中的类。

于 2012-04-11T15:55:55.360 回答
0

我认为这将是非常困难的,因为也有可能一个类使用反射来获得它想要的东西。

如果我试图这样做,我会编写自己的自定义类加载器,但我不确定类加载器接口是否知道哪个类实际上正在尝试加载。如果你想禁止所有代码使用某个包,我认为你可以使用自定义类加载器,但是如果你想要它更具体的类,你可能需要像grep这样的手动代码?

于 2012-04-11T14:17:31.913 回答
0

您不能让 JVM 过滤您正在编写的代码。但是,您可以使用泛型来限制所有公共 API 中允许的类。您还可以像这样限制继承:

class Parent {
    public Parent() throws Exception {
        if (this instanceof Child)
            throw new Exception("It's a child");
    }
}

public class Child extends Parent {
    public Child() throws Exception {
        super();
    }
}
于 2012-04-11T14:30:13.880 回答
0

像这样的东西:

$ find srcTree -name \*.java | xargs grep javax\\.swing
于 2012-04-11T14:21:16.470 回答