在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
,我在乎是否可以实例化它。某些protected
或package default
类型可以在代码中的任何给定点实例化,而其他类型则不能。
我做但是,如果他们的声明插件已添加到我的manifest.mf依赖项中,则希望看到可以实例化的类型。
如何找到我想要的类型(使用ITypeHierarchy
或任何其他机制),或从ITypeHierarchy
中排除我不需要的类型?
答案 0 :(得分:1)
IType
是IMember
,其中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())