Eclipse插件开发:如何从ICompilationUnit获取所有继承方法?
获取Eclipse插件中ICompilationUnit的所有继承方法
你说得没错,IType.getMethods()只能返回当前类自己声明的方法,继承自父类或接口的方法不会被包含在内。要拿到所有继承的方法,得借助JDT的类型层级(ITypeHierarchy) API来遍历整个继承链,下面是具体的实现思路和代码示例:
核心思路
- 先获取当前类的
IType实例(你代码里已经通过icu.getTypes()[0]拿到了) - 创建该类型的
ITypeHierarchy,它会帮你构建完整的继承/实现结构 - 遍历所有超类型(父类、爷爷类、实现的接口),逐个提取它们的方法
- 可选:过滤私有方法(因为私有方法无法被继承)、去重被重写的方法
代码实现
修改你的hasMethodCalledTest方法,加入类型层级的遍历逻辑:
private boolean hasMethodCalledTest(IType type) throws JavaModelException { // 先检查当前类自己的方法 for (IMethod method : type.getMethods()) { if ("test".equals(method.getElementName())) { return true; } } // 创建类型层级,传入null表示不需要进度监控(开发环境建议传入真实的IProgressMonitor) ITypeHierarchy typeHierarchy = type.newTypeHierarchy(null); // 获取当前类型的所有直接/间接超类型(包括父类、接口) IType[] allSuperTypes = typeHierarchy.getAllSupertypes(type); // 遍历所有超类型,检查是否有目标方法 for (IType superType : allSuperTypes) { for (IMethod superMethod : superType.getMethods()) { // 跳过私有方法(私有方法无法被继承) if (superMethod.isPrivate()) { continue; } if ("test".equals(superMethod.getElementName())) { return true; } } } return false; }
额外说明
- 方法去重:如果需要收集所有不重复的方法(比如避免重复添加被重写的方法),可以用
Map<String, IMethod>来存储,键用method.getSignature()(方法的唯一签名,包含名称和参数类型),这样就能自动去重。 - 访问权限过滤:除了私有方法,你还可以根据需求过滤
default(包访问权限)方法(如果当前类和超类不在同一个包下,也无法继承)。 - 接口方法:
ITypeHierarchy会包含所有实现的接口,所以接口中的方法也会被遍历到。
内容的提问来源于stack exchange,提问作者Bruno Silva
相关产品推荐
相关产品推荐

