查找可以实例化的相关类型

时间:2015-12-19 18:09:10

标签: java eclipse eclipse-jdt

在Eclipse(Mars,FWIW)中,我正在尝试构建与另一种类型相关的类型列表。 “相关”我的意思是我可能曾经想要类型为X的超类型,而在另一时间我可能想要类型为X的子类型。到现在为止还挺好。这听起来很像Eclipse "Open Type" dialog restricted to a particular interface。但...

我只想要实际可以在代码中的特定点使用的类型。比如说,我想替换下面的null

myFoo.setBar(null);

其中setBar()声明如下:

public class Foo {
    // ...
    public void setBar(Bar theNewBar) {
        this.myBar = theNewBar;
    }
    // ...
}

我不关心对Bar或其子类型的现有实例的引用,我只关心Bar本身及其可以在现场实例化的子类型,就好像我要做的那样写:

myFoo.setBar(new SubBar());

因此,具体而言,将排除声明为private的类型。 Local类型将被排除(除非我可以确定它们是在我当时正在使用的方法中声明的。在其他地方声明的匿名内部类已经出来了。所以......等待它...... 。任何基于其声明插件中定义的访问规则不可见的类型(即它的插件不会export)。(毕竟这是Eclipse,我关心符合插件-in model。)有代码辅助选项将排除这些类型(我认为CODEASSIST_DISCOURAGED_REFERENCE_CHECK和CODEASSIST_FORBIDDEN_REFERENCE_CHECK执行我想要的操作),但Code Assist无法区分子类型或超类型。

所以基本上,如果我不能直接实例化它,并且我不能为它编写一个匿名内部类,我不想看到它。

我已尝试使用ITypeHierarchy,但我无法在创建它或在它返回的ITypes中看到任何可用于区分我的标准的方法如上所述。

IType.isLocal()IType.isAnonymous()帮助。我可以使用它们来排除本地和匿名类型。但其他人呢?例如,我不关心类型是protected还是package default,我在乎是否可以实例化它。某些protectedpackage default类型可以在代码中的任何给定点实例化,而其他类型则不能。

但是,如果他们的声明插件已添加到我的manifest.mf依赖项中,则希望看到可以实例化的类型。

如何找到我想要的类型(使用ITypeHierarchy或任何其他机制),或从ITypeHierarchy中排除我不需要的类型?

1 个答案:

答案 0 :(得分:1)

ITypeIMember,其中int getFlags()  返回由Flags定义的标志的方法,它具有良好的帮助方法,例如:

Flags.isAbstract(iType.getFlags())
Flags.isInterface(iType.getFlags())
Flags.isPackageDefault(iType.getFlags()) // You then compare package yourself
Flags.isProtected(iType.getFlags()) // You then compare package yourself
Flags.isPublic(iType.getFlags())