我想获得一个具有完全限定名称的给定类的所有子类的列表。我想从Eclipse复制它并粘贴到这样的文本文件中:
some.package.Class1
some.package.Class2
some.other.package.Class3
...
我试过了:
Search | Java | Type, Limit to implementors
。 但是这个由于一些奇怪的原因没有列出子类的子类,只列出直接后代。Hierarchy
视图,该类打印树组件中的所有子类,但此视图不允许我选择所有行并复制其名称。还有其他技巧吗?有数百个类,所以我想避免手动操作。
答案 0 :(得分:3)
Hierarchy视图中构建层次结构树的方法位于org.eclipse.jdt.internal.ui.typehierarchy.TypeHierarchyLifeCycle
:
private ITypeHierarchy createTypeHierarchy(IJavaElement element, IProgressMonitor pm) throws JavaModelException {
if (element.getElementType() == IJavaElement.TYPE) {
IType type= (IType) element;
if (fIsSuperTypesOnly) {
return type.newSupertypeHierarchy(pm);
} else {
return type.newTypeHierarchy(pm);
}
} else {
使用org.eclipse.jdt.internal.core.SourceType类
/**
* @see IType
*/
public ITypeHierarchy newTypeHierarchy(IJavaProject project, IProgressMonitor monitor) throws JavaModelException {
return newTypeHierarchy(project, DefaultWorkingCopyOwner.PRIMARY, monitor);
}
因此,如果您可以获得IJavaElement
,则可以检查这些类以模拟相同的结果。
它使用org.eclipse.jdt.internal.core.CreateTypeHierarchyOperation
答案 1 :(得分:3)
更新:我的原始答案不起作用,因为结构化选择没有上下文。
This answer显示了如何将操作提供给上下文菜单并检索结构化选择。您可以修改该类型的执行方法来处理层次结构(如VonC建议的那样,+ 1)并获取所有子类型并将内容设置到剪贴板,如下所示:
public Object execute(ExecutionEvent event) throws ExecutionException {
IWorkbenchPart activePart = HandlerUtil.getActivePart(event);
try {
IStructuredSelection selection = SelectionConverter
.getStructuredSelection(activePart);
IJavaElement[] elements = SelectionConverter.getElements(selection);
if (elements != null && elements.length > 0) {
if (elements[0] != null && elements[0] instanceof IType) {
IType type = (IType)elements[0];
ITypeHierarchy hierarchy =
type.newTypeHierarchy(new NullProgressMonitor());
IType[] subTypes = hierarchy.getAllSubtypes(type);
StringBuffer buf = new StringBuffer();
for (IType iType : subTypes) {
buf.append(iType.getFullyQualifiedName()).append("\n");
}
Shell shell = HandlerUtil.getActiveShell(event);
Clipboard clipboard = new Clipboard(shell.getDisplay());
clipboard.setContents(
new Object[]{buf.toString()},
new Transfer[]{TextTransfer.getInstance()});
}
}
} catch (JavaModelException e) {
logException(e);
}
return null;
}
答案 2 :(得分:1)
nWire for Java可以为您提供扩展给定类或实现特定接口的类的完整列表。您将在nWire导航器中获取它,该导航器不提供复制命令。
但是,您可以使用nWire数据库,这是一个标准的H2数据库,结构非常简单,只需简单查询即可获得所需的一切。我们将在未来的某个时候介绍报告功能。
恕我直言,这样做的努力就少了,你会得到一个能给你更多的工具。答案 3 :(得分:0)
遵循http://internna.blogspot.com/2007/11/java-5-retrieving-all-classes-from.html中描述的模式,可以通过编程方式进行。遗憾的是Eclipse无法做到OOTB。在Java代码中执行此操作可以进行过滤而无需额外成本(例如!(klazz.isEnum())
)。