查找可以实例化的相关类型
Find related types that can be instantiated
在 Eclipse(Mars,FWIW)中,我正在尝试构建与另一种类型相关的类型列表。 "related" 我的意思是我可能有时想要类型 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
类型将被排除在外(除非我可以确定它们是在我当时正在使用的方法中声明的。在其他地方声明的匿名内部 classes 已经过时了。也是...等待它...根据其声明插件中定义的访问规则不可见的任何类型(即它的插件不 export
它)。(毕竟这是 Eclipse,我关心关于符合插件模型。)有一些 Code Assist 选项将排除这些类型(CODEASSIST_DISCOURAGED_REFERENCE_CHECK 和 CODEASSIST_FORBIDDEN_REFERENCE_CHECK 做我想做的,我想)但 Code Assist 无法区分子类型或超类型。
所以基本上,如果我不能直接实例化它,我不能为它写一个匿名内部class,我不想看到它。
我试过使用 ITypeHierarchy
,但我在创建它或在它 returns 的 ITypes
中看不到任何可用于区分的方法我上面提到的标准。
IType.isLocal()
和 IType.isAnonymous()
帮助。我可以使用它们来排除本地和匿名类型。但其他人呢?比如我不关心一个类型是protected
还是package default
,我关心的是我能不能实例化它。某些 protected
或 package default
类型可以在代码中的任何给定点实例化,而其他类型则不能。
我 做 ,但是,我想看看如果将声明插件添加到我的 manifest.mf 依赖项中可以实例化的类型。
我怎样才能找到我想要的类型(使用 ITypeHierarchy
或任何其他机制),或者从 ITypeHierarchy
中排除我不需要的类型?
IType
is an IMember
, which has the 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())
在 Eclipse(Mars,FWIW)中,我正在尝试构建与另一种类型相关的类型列表。 "related" 我的意思是我可能有时想要类型 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
类型将被排除在外(除非我可以确定它们是在我当时正在使用的方法中声明的。在其他地方声明的匿名内部 classes 已经过时了。也是...等待它...根据其声明插件中定义的访问规则不可见的任何类型(即它的插件不 export
它)。(毕竟这是 Eclipse,我关心关于符合插件模型。)有一些 Code Assist 选项将排除这些类型(CODEASSIST_DISCOURAGED_REFERENCE_CHECK 和 CODEASSIST_FORBIDDEN_REFERENCE_CHECK 做我想做的,我想)但 Code Assist 无法区分子类型或超类型。
所以基本上,如果我不能直接实例化它,我不能为它写一个匿名内部class,我不想看到它。
我试过使用 ITypeHierarchy
,但我在创建它或在它 returns 的 ITypes
中看不到任何可用于区分的方法我上面提到的标准。
IType.isLocal()
和 IType.isAnonymous()
帮助。我可以使用它们来排除本地和匿名类型。但其他人呢?比如我不关心一个类型是protected
还是package default
,我关心的是我能不能实例化它。某些 protected
或 package default
类型可以在代码中的任何给定点实例化,而其他类型则不能。
我 做 ,但是,我想看看如果将声明插件添加到我的 manifest.mf 依赖项中可以实例化的类型。
我怎样才能找到我想要的类型(使用 ITypeHierarchy
或任何其他机制),或者从 ITypeHierarchy
中排除我不需要的类型?
IType
is an IMember
, which has the 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())