从eclipse中的界面快速创建类

是否有一个eclipse插件允许我从界面快速生成一个新类?

而不是必须在新类对话框中键入

理想情况下,让我选择像Impl这样的标准名称来生成它

我没见过任何插件,但这对我来说似乎是一个合理的捷径。

以下内容可以构成插件直接从所选接口生成类的基础。 它适用于我的盒子(TM)。

它目前假定该类将接口名称后缀为“Impl”,如果该类型已存在则失败(记录原因)。

我能想到的一些改进:

  • 允许选择多个接口
  • 为实现后缀和包名定义首选项页面
  • 如果“默认”实现已存在,则打开与填充值对话的对话框

该插件向编辑器,视图和文本选择的上下文菜单添加命令,如果选择未解析为接口,则禁用该项。 它也可以用ctrl-6激活(显然你可以更改plugin.xml中的键绑定以适应你的心情)。

插件代码如下:

package name.seller.rich.classwizard.actions; import java.util.Collections; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.expressions.EvaluationContext; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.actions.SelectionConverter; import org.eclipse.jdt.ui.wizards.NewClassWizardPage; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; public class GenerateClassHandler extends AbstractHandler { public GenerateClassHandler() { } public Object execute(ExecutionEvent event) throws ExecutionException { NewClassWizardPage page = new NewClassWizardPage(); EvaluationContext evaluationContext = (EvaluationContext) event .getApplicationContext(); IWorkbenchPart activePart = (IWorkbenchPart) evaluationContext .getVariable("activePart"); try { IStructuredSelection selection = SelectionConverter .getStructuredSelection(activePart); IType type = getFirstType(selection); if (type != null && type.exists() && type.isInterface()) { page.init(selection); String typeName = type.getElementName() + "Impl"; // TODO handle existing type page.setTypeName(typeName, true); // generate constructors and methods, allow modification page.setMethodStubSelection(false, true, true, true); page.setSuperInterfaces(Collections.singletonList(type .getFullyQualifiedName()), true); try { page.createType(new NullProgressMonitor()); IResource resource = page.getModifiedResource(); if (resource != null) { IWorkbenchWindow window = HandlerUtil .getActiveWorkbenchWindowChecked(event); BasicNewResourceWizard .selectAndReveal(resource, window); openResource((IFile) resource, window); } } catch (CoreException e) { // TODO if we get this the type already exists, open a // dialogue to allow the type name to be modified or give // up? logException(e); } } } catch (JavaModelException e) { logException(e); } catch (InterruptedException e) { logException(e); } return null; } protected void openResource(final IFile resource, IWorkbenchWindow window) { final IWorkbenchPage activePage = window.getActivePage(); if (activePage != null) { final Display display = window.getShell().getDisplay(); if (display != null) { display.asyncExec(new Runnable() { public void run() { try { IDE.openEditor(activePage, resource, true); } catch (PartInitException e) { logException(e); } } }); } } } @Override public void setEnabled(Object context) { if (context != null && context instanceof EvaluationContext) { EvaluationContext evaluationContext = (EvaluationContext) context; IWorkbenchPart activePart = (IWorkbenchPart) evaluationContext .getVariable("activePart"); try { IStructuredSelection selection = SelectionConverter .getStructuredSelection(activePart); IType type = getFirstType(selection); if (type != null) { setBaseEnabled(type.isInterface()); return; } } catch (JavaModelException e) { logException(e); } } setBaseEnabled(false); } private IType getFirstType(IStructuredSelection selection) { IJavaElement[] elements = SelectionConverter.getElements(selection); if (elements != null && elements.length > 0) { if (elements[0] != null && elements[0] instanceof IType) { return (IType) elements[0]; } try { if (elements[0] != null && elements[0] instanceof ICompilationUnit) { IType[] types = ((ICompilationUnit) elements[0]) .getAllTypes(); if (types != null && types.length > 0) { return types[0]; } } } catch (JavaModelException e) { logException(e); } } return null; } protected void logException(Exception e) { JavaPlugin.log(e); } } 

提供命令的plugin.xml是:

                       

并且manifest.mf看起来像这样:

 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Classwizard Bundle-SymbolicName: name.seller.rich.classwizard; singleton:=true Bundle-Version: 1.0.0 Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.jdt.core;bundle-version="3.5.0", org.eclipse.core.expressions;bundle-version="3.4.100", org.eclipse.jface.text;bundle-version="3.5.0", org.eclipse.jdt.ui;bundle-version="3.5.0", org.eclipse.ui.ide;bundle-version="3.5.0", org.eclipse.ui.editors;bundle-version="3.5.0", org.eclipse.core.resources;bundle-version="3.5.0" Eclipse-AutoStart: true Bundle-RequiredExecutionEnvironment: JavaSE-1.6 

除了以下方面之外没有看到任何其他内容:右键单击包浏览器中的接口类型,选择New-> Class ,它将自动实现该接口。 您仍然必须自己命名新课程。

它实际上是在2002年被问到的

重构应从类中提取所有(切换为“所有公共”)方法,创建接口并将旧类重命名为Classname Impl

…并作为function请求输入,在故障单9798中 “已解决”,因为New-> Class将具有选项“Inherited abstract method”(至少自Eclipse SDK 2.1 2003)供您选择以便自动实现那些公共抽象方法。

替代文字

如果您创建一个类,让它实现一个接口。

您会收到错误,因为未定义方法。 只需按Ctrl-1或右clic,您就可以根据需要使用TODO,javadoc注释等创建所有方法(具体取决于Eclipse的配置方式)。

方法1 :右键单击类名,然后选择“快速修复”,然后会出现一个小菜单,您可以在其中选择:“添加未实现的方法”。

方法2 :右键单击类名,转到“源”,然后选择“覆盖/实现方法”