如何以编程方式从父类生成构造方法?基于OSGI项目复用Eclipse相关功能的技术问询
实现Eclipse风格的任意父类构造方法生成(OSGi环境适配)
嘿,这个需求完全可行!我之前在基于OSGi的Eclipse插件项目里做过类似的功能,刚好可以给你梳理一下关键点:
核心OSGi Bundle信息
实现这个功能依赖两个关键的Eclipse JDT相关bundle:
org.eclipse.jdt.ui:这是包含「Generate Constructors from Superclass」功能实现的核心bundle,里面有对应的Action类和代码生成逻辑。org.eclipse.jdt.core:提供Java源码的抽象模型(比如IType、IMethod等接口),用来解析父类的构造方法签名,是JDT操作的基础依赖。
如何复用Eclipse的原生功能
你不需要直接调用菜单命令,而是可以复用JDT UI里的公开/内部API来实现:
- 核心入口类:对应菜单功能的实现类是
org.eclipse.jdt.ui.actions.GenerateConstructorsAction,你可以在OSGi环境下获取这个类的实例,或者直接参考它的逻辑。 - 核心生成逻辑:实际的构造方法生成逻辑封装在
org.eclipse.jdt.internal.ui.refactoring.codegen.ConstructorGenerator(虽然是internal包,但在OSGi环境下,只要你的bundle依赖了org.eclipse.jdt.ui,就可以调用)。
简化的代码示例思路
假设你已经通过JDT API获取到了子类的IType实例,可以这样生成构造方法:
import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.internal.ui.refactoring.codegen.ConstructorGenerator; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; // 假设subType是目标子类的IType实例 IType superType = subType.getSuperclassType().resolve(); if (superType != null) { // 筛选父类的所有构造方法 List<IMethod> superConstructors = Arrays.stream(superType.getMethods()) .filter(IMethod::isConstructor) .collect(Collectors.toList()); // 初始化生成器并生成构造方法代码 ConstructorGenerator generator = new ConstructorGenerator(subType, superConstructors.toArray(new IMethod[0])); // 创建编辑操作并应用到编译单元(这里需要结合Eclipse的IWorkspaceRunnable来做事务性修改) generator.createEdit(null).apply(null); }
源码参考位置
Eclipse JDT的源码里,你可以找到这些类的具体实现:
GenerateConstructorsAction:位于org.eclipse.jdt.uibundle的src/org/eclipse/jdt/ui/actions/目录下ConstructorGenerator:位于org.eclipse.jdt.uibundle的src/org/eclipse/jdt/internal/ui/refactoring/codegen/目录下
OSGi环境适配注意事项
在你的bundle的MANIFEST.MF里,需要添加对这两个bundle的依赖:
Require-Bundle: org.eclipse.jdt.core;bundle-version="[3.20.0,4.0.0)", org.eclipse.jdt.ui;bundle-version="[3.20.0,4.0.0)"
或者使用Import-Package导入需要的具体包(比如org.eclipse.jdt.ui.actions、org.eclipse.jdt.core等)。
内容的提问来源于stack exchange,提问作者Soundbytes
相关产品推荐
相关产品推荐

