You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以编程方式从父类生成构造方法?基于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来实现:

  1. 核心入口类:对应菜单功能的实现类是org.eclipse.jdt.ui.actions.GenerateConstructorsAction,你可以在OSGi环境下获取这个类的实例,或者直接参考它的逻辑。
  2. 核心生成逻辑:实际的构造方法生成逻辑封装在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.ui bundle的src/org/eclipse/jdt/ui/actions/目录下
  • ConstructorGenerator:位于org.eclipse.jdt.ui bundle的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 02:52:37