回答
我还没有看到这样做的任何插件,但它似乎是一个合理的捷径。
以下内容可以构成插件直接从选定界面生成类的基础。它适用于我的盒子(TM)。
它目前假定该类将接口名称后缀为“Impl”,如果该类型已存在,则会失败(记录原因)。
一些改进,我能想到的:
- 允许多个接口
- 选择定义一个首选项页面的执行后缀和包名
- 打开使用,如果“默认填充值的对话“实现已经存在
该插件为编辑器,视图和文本选择的上下文菜单添加一个命令,禁用该项目ection不解析为接口。它也可以用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的是:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
<extension
point="org.eclipse.ui.commands">
<command
name="Generate Class"
categoryId="name.seller.rich.classwizard.category"
id="name.seller.rich.classwizard.generateClassCommand">
</command>
</extension>
<extension
point="org.eclipse.ui.handlers">
<handler
commandId="name.seller.rich.classwizard.generateClassCommand"
class="name.seller.rich.classwizard.actions.GenerateClassHandler">
</handler>
</extension>
<extension
point="org.eclipse.ui.bindings">
<key
commandId="name.seller.rich.classwizard.generateClassCommand"
contextId="org.eclipse.ui.contexts.window"
sequence="M1+6"
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
</key>
</extension>
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="popup:org.eclipse.ui.popup.any?after=additions">
<command
commandId="name.seller.rich.classwizard.generateClassCommand"
mnemonic="G">
</command>
</menuContribution>
</extension>
</plugin>
和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,它将自动实现该接口。你仍然必须自己命名新课程。
不起作用。你错了。 – user710818 2011-11-02 06:42:25
@ user710818您可能是右键单击Package Explorer中的.java文件,而不是类型(即只展开包含该接口的.java文件,并右键单击接口类型,选择New-> Class)。至少在Indigo和Helios中这是完美的。 – nos 2011-11-02 08:32:06
@nos谢谢,它也适用于Luna – 2015-04-10 09:00:09
实际上,它是尽快问as 2002
重构应提取所有(开关“全部公开”)从一个类的方法 ,创建一个接口和老班 重命名为类名默认地将Impl 。
...并输入为feature request,“解决”,在ticket 9798,因为新建 - >类将有选择‘继承抽象方法’(因为至少Eclipse SDK 2.1 2003)供您才能选择自动实现这些公共抽象方法。
你是贡献者吗?你真的好像对此非常了解:) – javamonkey79 2009-09-07 00:17:31
@ javamonkey79:nope,但是一些真正的eclipse贡献者会回答这个问题:请参阅这个答案(及其评论):http://stackoverflow.com/questions/1363584/eclipse-improve-debugging-display-vairable-values-on-mouseover/1363640#1363640 – VonC 2009-09-07 04:05:39
我想看到的是在“实施”列表中预填充了我选择的界面的新建类对话框。 – Arkadiy 2011-11-23 20:50:33
如果你创建一个类,让它实现一个接口。
您会收到错误,因为方法未定义。只需按Ctrl-1或右键,就可以根据需要创建所有方法,包括TODO,javadoc注释等等(取决于Eclipse的配置方式)。
方法1:右键单击班级名称,然后选择“快速修复”,一个然后会出现一个小菜单,您可以在其中选择:“添加未实现的方法”。
方法2:右键单击类名,进入“源”,然后选择“覆盖/实现方法”
- 1. VS2010 - 如何快速重命名新创建的界面控件
- 2. 快速创建Singelton类?
- 3. Eclipse - 快速创建文件accessbile
- 4. 如何快速创建新闻提要界面
- 5. 从psd创建iphone界面
- 6. 快速创建data.frame
- 7. 如何快速创建Javadoc链接到Eclipse中的元素?
- 8. 创建界面
- 9. 在eclipse中快速构建Android
- 10. 快速创建用户界面而不拖放的最佳语言?
- 11. JS库创建类似的界面
- 12. 虚拟vs界面poco,速度更快?
- 13. 如何创建一个快速界面来编辑/删除/添加数据库?
- 14. 创建快速GUI前端
- 15. 快速创建变量
- 16. php快速创建表格
- 17. 创建快速搜索值
- 18. 如何使Eclipse IDE快速构建
- 19. Eclipse:如何为If-else创建快速辅助开关
- 20. 如何在C#中快速创建TempFile?
- 21. 从C++中的文本文件快速创建图形
- 22. 创建聊天界面?
- 23. 快速的方法来创建对
- 24. 创建一个快速的ios框架
- 25. 如何在Cocoa和IB中创建类似Keynote的界面?
- 26. 在Microsoft CRM中快速创建表单中添加一个快速字段
- 27. Eclipse快速对话框DefaultInformationControl
- 28. 有什么工具可以快速创建GWT的RPC类吗?
- 29. 如何从Xcode 4中的实体创建用户界面?
- 30. 在Dojo中创建Google Maps界面
“新阶级”对话框不够快的吗? – skaffman 2009-09-06 18:53:19
以史诗级别懒惰 – laurie 2009-09-06 20:21:16
很明显,但我不明白它是如何比现在更快......您键入类名称,选择接口,然后向导将生成该接口的默认实现。 ..怎么可能更快? – skaffman 2009-09-06 20:35:19