??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
point="org.eclipse.core.expressions.propertyTesters">
<propertyTester
class="com.ebay.tools.vjet2.internal.debug.property.LaunchPropertyTester"
id="com.ebay.tools.vjet2.debug.property.launch"
namespace="com.ebay.tools.vjet2.debug"
properties="launchJS,launchHTML"
type="org.eclipse.core.runtime.IAdaptable">
</propertyTester>
</extension>
Specified class should be extends PropertyTester and implement related methods.
LaunchPropertyTester extends PropertyTester {
Others services register.
IFocusService focusService = (IFocusService) PlatformUI.getWorkbench() .getService(IFocusService.class); focusService.addFocusTracker(text, "textControlId");
All variables collected in ISources class, User can find related variables in this class.
新特性之八:(x)新增?U启动界面;
Interactive: A simulated log-in session 使用一个程序登陆界面启?br />
Browser: An embedded HTML browser 使用一个Html作ؓ(f)登陆界面
Extensible: A dynamic set of image contributions 使用一张图片作为启动界?br />
在新的PDE中可以对一个product选择使用那一U启动界面启动,q个新功能的增加是非常有意义的,它得RCP应用更加的h性化Q不用再在系l启动中弹出对话框了(jin)Q让客户更加攑ֿ(j)的选择ZRCP的品了(jin)~
Eclipse3.4发布 新特性展C?
|
上一文?/font>我们知道?jin)Eclipse弹出菜单的基本用法。其实Eclipse的弹单可以用来做很多文章Q简单一点的Ҏ(gu)文gcdQ我们可以进行不同的文g操作Q比如Ant的build.xml我们可以用来buildQJava文g我们可以用Java Editor打开Q这些基于文件类型的操作我们都可以很Ҏ(gu)的实现。但是还有一U情况,如果文gcd一P我们惌行不同的操作Q该怎么实现呢?实际上这L(fng)应用很多Q比如同hJava文gQ含有mainҎ(gu)的Java文g有Run和Debug的选项Q其它的都没有。还有现在的框架都是ZXML文gq行配置的,如果一个项目用了(jin)多个框架Q我们怎么Ҏ(gu)不同的XML文gq行框架的区分呢Q答案就是enablement的test?/font>
<!ELEMENT test EMPTY>
<!ATTLIST test
property CDATA #REQUIRED
args CDATA #IMPLIED
value CDATA #IMPLIED>
This element is used to evaluate the property state of the object in focus. The set of testable properties can be extended using the propery tester extension point. The test expression returns EvaluationResult.NOT_LOADED if teh property tester doing the actual testing isn't loaded yet.
比如我们要让含有mainҎ(gu)的Java文g它的右键弹出菜单包含一个额外的选项“This is main class”Q需要编写如下的Plugin.xmlQ?/font>
我们需要检在当前情况下是否需要显C个菜单项Q用扩展点 org.eclipse.core.expressions.propertyTesters Q?br />
<!ELEMENT propertyTester EMPTY>
<!ATTLIST propertyTester
id CDATA #REQUIRED
type CDATA #REQUIRED
namespace CDATA #REQUIRED
properties CDATA #REQUIRED
class CDATA #REQUIRED>
id - unique identifier for the property tester
type - the type to be extended by this property tester
namespace - a unique id determining the name space the properties are added to
properties - a comma separated list of properties provided by this property tester
class - the name of the class that implements the testing methods. The class must be public and extend org.eclipse.core.expressions.PropertyTester with a public 0-argument constructor.
q里只须注意 propertyTester的namespace和properties正好对应test的property?br />
至于(g)的逻辑我们在advancedpopupmenus.popup.actions.VisablePropertyTester中实玎ͼq个cdȝ承自org.eclipse.core.expressions.PropertyTester?/font>
我们只要判断接受的Java文g中是否含有mainҎ(gu)Q如果有Q则q回TrueQ没有则q回False?br />
如果我们是要接受一个Web开发的配置文gQ我们可以这样写Q?/font>
注意和上一个例子不同的地方QobjectClassQnameFileter和type(在上一个例子中Q我们也可以使用objectClass="org.eclipse.core.resources.IFile" nameFilter ="*.java" )Q相应的我们的VisablePropertyTestercM要做一些改动:(x)
q样Ҏ(gu)不同的xml SystemIDQ我们就能够知道到底q是哪一U框架的配置文g?jin)?/font>
最下面一行是启动Ӟ昄MyEclipse的图片,如果没有q句话运?MyEclipse 6.0.1"快捷方式Q则?x)显Ceclipse的启动画面,其实"MyEclipse 6.0.1"快捷方式q是q接着eclipse.exeq个执行E序Q在"MyEclipse 6.0.1"上点右键Q选择属性,在目标里可以看到?br />
W?步:(x)注册MyEclipse
MyEclipse6.0的注册一定要断开|络Q否则肯定不成功Q?br />
6.0.1GA注册?br />
Subscriber: administrator
Subscription Code: nLR7ZL-655342-54657656405281154
q里有一点大象要提醒大家注意Q如果你?sh)脑上现在正有用的MyEclipseQ就是说已经注册?jin),那么在C:\Documents and Settings\"自己的用户名" 目录下,?x)有一?.myeclipse.properties"文gQ这时请先备份此文gQ然后删除它Q断开|络Q再来注册MyEclipse6.0.1Q成功后如下Q?br />
其中createASTQ当parse需要较长时间时Q可以采用createAST(new NullProgressMonitor())Q否则直接传null卛_?/font>
recordModifications()用于记录节点的变动,比如修改、删除等Q当需要对AST?wi)进行变动操作时Q必要预先调用q个Ҏ(gu)?/font>
比较重要的是Q一个AST?wi)上的所有节点必都属于该AST。不允许直接其他AST?wi)上的节?gu)加该AST?wi)上。否则会(x)抛出java.lang.IllegalArgumentException异常。须使用ASTNode.copySubtree(AST target, ASTNode node)q回一个目标树(wi)的深度拷贝,才能q行d操作。例?
// package astexplorer;java 代码
- PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
- unit.setPackage(packageDeclaration);
- packageDeclaration.setName(ast.newSimpleName("astexplorer"));
// import org.eclipse.swt.SWT;
// import org.eclipse.swt.events.*;
// import org.eclipse.swt.graphics.*;
// import org.eclipse.swt.layout.*;
// import org.eclipse.swt.widgets.*;java 代码
- for (int i = 0; i < IMPORTS.length; ++i) {
- ImportDeclaration importDeclaration = ast.newImportDeclaration();
- importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));
- if (IMPORTS[i].indexOf("*") > 0)
- importDeclaration.setOnDemand(true);
- else
- importDeclaration.setOnDemand(false);
- unit.imports().add(importDeclaration);
- }
// public class SampleComposite extends Composite
java 代码
- TypeDeclaration classType = ast.newTypeDeclaration();
- classType.setInterface(false);
- classType.setModifiers(Modifier.PUBLIC);
- classType.setName(ast.newSimpleName("SampleComposite"));
- classType.setSuperclass(ast.newSimpleName("Composite"));
- unit.types().add(classType);
List 4 生成Constructor Declaration
// public SampleComposite(Composite parent,int style){}
java 代码
- MethodDeclaration methodConstructor = ast.newMethodDeclaration();
- methodConstructor.setConstructor(true);
- methodConstructor.setModifiers(Modifier.PUBLIC);
- methodConstructor.setName(ast.newSimpleName("SampleComposite"));
- classType.bodyDeclarations().add(methodConstructor);
- // constructor parameters
- SingleVariableDeclaration variableDeclaration = ast.newSingleVariableDeclaration();
- variableDeclaration.setModifiers(Modifier.NONE);
- variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName("Composite")));
- variableDeclaration.setName(ast.newSimpleName("parent"));
- methodConstructor.parameters().add(variableDeclaration);
- variableDeclaration = ast.newSingleVariableDeclaration();
- variableDeclaration.setModifiers(Modifier.NONE);
- variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));
- variableDeclaration.setName(ast.newSimpleName("style"));
- methodConstructor.parameters().add(variableDeclaration);
- Block constructorBlock = ast.newBlock();
- methodConstructor.setBody(constructorBlock);
List 5 生成Spuer Invocation
// super(parent,style)
java 代码
- SuperConstructorInvocation superConstructorInvocation = ast.newSuperConstructorInvocation();
- constructorBlock.statements().add(superConstructorInvocation);
- Expression exp = ast.newSimpleName("parent");
- superConstructorInvocation.arguments().add(exp);
- superConstructorInvocation.arguments().add(ast.newSimpleName("style"));
List 6 生成ClassInstanceCreation
// GridLayout gridLayout = new GridLayout();
java 代码
- VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();
- vdf.setName(ast.newSimpleName("gridLayout"));
- ClassInstanceCreation cc = ast.newClassInstanceCreation();
- cc.setName(ast.newSimpleName("GridLayout"));
- vdf.setInitializer(cc);
- VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);
- vds.setType(ast.newSimpleType(ast.newSimpleName("GridLayout")));
- constructBlock.statements().add(vds);
// Label label = new Label(this,SWT.NONE);
java 代码
- VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();
- vdf.setName(ast.newSimpleName("label"));
- cc = ast.newClassInstanceCreation();
- cc.setName(ast.newSimpleName("Label"));
- cc.arguments().add(ast.newThisExpression());
- cc.arguments().add(ast.newName(getSimpleNames("SWT.NONE")));
- vdf.setInitializer(cc);
- VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);
- vds.setType(ast.newSimpleType(ast.newSimpleName("Label")));
- constructBlock.statements().add(vds);
List 7生成MethodInvocation
// setLayout(gridLayout);
java 代码
- MethodInvocation mi = ast.newMethodInvocation();
- mi.setName(ast.newSimpleName("setLayout"));
- mi.arguments().add(ast.newSimpleName("gridLayout"));
- constructorBlock.statements().add(ast.newExpressionStatement(mi));
// label.setText("Press the button to close:");
java 代码
- mi = ast.newMethodInvocation();
- mi.setExpression(ast.newSimpleName("label"));
- mi.setName(ast.newSimpleName("setText"));
- StringLiteral sl = ast.newStringLiteral();
- sl.setLiteralValue("Press the button to close:");
- mi.arguments().add(sl);
- constructorBlock.statements().add(ast.newExpressionStatement(mi));
// label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
java 代码
- mi = ast.newMethodInvocation();
- mi.setExpression(ast.newSimpleName("label"));
- mi.setName(ast.newSimpleName("setLayoutData"));
- cc = ast.newClassInstanceCreation();
- cc.setName(ast.newSimpleName("GridData"));
- cc.arguments().add(ast.newName(getSimpleNames("GridData.HORIZONTAL_ALIGN_CENTER")));
- mi.arguments().add(cc);
- constructorBlock.statements().add(ast.newExpressionStatement(mi));
// Button button = new Button(this,SWT.PUSH);
java 代码
- vdf = ast.newVariableDeclarationFragment();
- vdf.setName(ast.newSimpleName("button"));
- vds = ast.newVariableDeclarationStatement(vdf);
- vds.setType(ast.newSimpleType(ast.newSimpleName("Button")));
- constructorBlock.statements().add(vds);
- cc = ast.newClassInstanceCreation();
- cc.setName(ast.newSimpleName("Button"));
- vdf.setInitializer(cc);
- cc.arguments().add(ast.newThisExpression());
- cc.arguments().add(ast.newName(getSimpleNames("SWT.PUSH")));
// button.addSelectionListener(new SelectionAdapter() {});
java 代码
- mi = ast.newMethodInvocation();
- constructorBlock.statements().add(ast.newExpressionStatement(mi));
- mi.setExpression(ast.newSimpleName("button"));
- mi.setName(ast.newSimpleName("addSelectionListener"));
- ClassInstanceCreation ci = ast.newClassInstanceCreation();
- ci.setName(ast.newSimpleName("SelectionAdapter"));
- mi.arguments().add(ci);
- AnonymousClassDeclaration cd = ast.newAnonymousClassDeclaration();
- ci.setAnonymousClassDeclaration(cd);
// public void setup(){super.setUp()}
- MethodDeclaration methodConstructor = ast.newMethodDeclaration();
methodConstructor.modifiers().add(
ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
methodConstructor.setName(ast.newSimpleName("setUp"));- Block constructorBlock = ast.newBlock();
methodConstructor.setBody(constructorBlock);- SuperMethodInvocation smi = ast.newSuperMethodInvocation();
smi.setName(ast.newSimpleName("setUp"));
ExpressionStatement es = ast.newExpressionStatement(smi);
constructorBlock.statements().add(es);- // set exception
List targetExNames = methodConstructor.thrownExceptions();
Name targetExName = ast.newName(Exception.class.getName());
targetExNames.add(targetExName);- methodConstructor.setJavadoc(JavaDocHelper.getJavaDoc(ast,
JavaDocHelper.setUpDoc, null, null));
classType.bodyDeclarations().add(methodConstructor);
package com.wipro.testtools.ui.internal.action;
import java.util.Iterator;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.internal.OpenPreferencesAction;
import org.eclipse.ui.internal.Workbench;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.actions.OpenPerspectiveDialogAction;
import org.eclipse.ui.internal.dialogs.SelectPerspectiveDialog;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.IPreferencePage;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.swt.widgets.Shell;
public class OpenPreferencePages implements IWorkbenchWindowActionDelegate {
public OpenPreferencePages() {
super();
}
private IWorkbenchWindow workbenchWindow;
public void dispose() {
}
public void init(IWorkbenchWindow window) {
workbenchWindow = window;
}
public void run(IAction action) {
ts2();
}
private void ts2() {
// OpenPreferencesAction action = new OpenPreferencesAction();
// OpenPerspectiveDialogAction action = new
// OpenPerspectiveDialogAction(null);
// action.run();
String ourPreferenceDialog = "com.wipro.testtools.ui.preferences.SamplePreferencePage";
PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(null, ourPreferenceDialog, new String[]{ourPreferenceDialog}, null);
dialog.open();
}
/**
*
*/
private void ts1() {
String PreferenceNodeId = "org.eclipse.ui.preferencePages.Workbench";
PreferenceDialogWrapper dialog = null;
PreferenceManager manager = WorkbenchPlugin.getDefault()
.getPreferenceManager();
if (manager != null) {
dialog = new PreferenceDialogWrapper(getShell(), manager);
dialog.create();
// WorkbenchHelp.setHelp(dialog.getShell(),
// IHelpContextIds.PREFERENCE_DIALOG);
for (Iterator iterator = manager.getElements(
PreferenceManager.PRE_ORDER).iterator(); iterator.hasNext();) {
IPreferenceNode node = (IPreferenceNode) iterator.next();
System.out.println(node.getId());
if (node.getId().equals(PreferenceNodeId)) {
dialog.showPage(node);
}
}
dialog.open();
}
}
public void selectionChanged(IAction action, ISelection selection) {
}
private Shell getShell() {
return DialogCheck.getShell();
}
}
class PreferenceDialogWrapper extends PreferenceDialog {
public PreferenceDialogWrapper(Shell parentShell, PreferenceManager manager) {
super(parentShell, manager);
super.setSelectedNodePreference("PreferenceNodeId");// this is added
}
public boolean showPage(IPreferenceNode node) {
return super.showPage(node);
}
public IPreferencePage getPage(IPreferenceNode node) {
if (node == null)
return null;
if (node.getPage() == null)
node.createPage();
if (node.getPage() == null)
return null;
return node.getPage();
}
}
class DialogCheck {
private DialogCheck() {
}
private static VerifyDialog _verifyDialog;
public static Shell getShell() {
Shell shell = WorkbenchPlugin.getDefault().getWorkbench()
.getActiveWorkbenchWindow().getShell();
_verifyDialog = new VerifyDialog(shell);
_verifyDialog.create();
return _verifyDialog.getShell();
}
}
class VerifyDialog extends TitleAreaDialog {
public VerifyDialog(Shell parent) {
super(parent);
}
}
其实eclipse提供?jin)这L(fng)API: See the TS2 Method:
Just two line codes. :(
CSS插gQ?a >http://csseditor.sourceforge.net
JS和AS插gQ?a >http://sourceforge.net/projects/jseditor
XML插gQ?a >http://xmlbuddy.com
正则表达式测试插Ӟ(x)http://brosinski.com/stephan/archives/000028.php
XPath试插gQ?a >http://www.purpletech.com/xpe/index.jsp
更多Eclipse插gQ?a >http://eclipse-plugins.2y.net/eclipse/index.jsp
问题提出Q?
当我们编写完代码Q做完单元测试等各种试后就提交正式q行Q只能由q行的系l来(g)我们代码是否有问题?jin),代码中隐藏的错误在系l运行的q程中被发现后,然后再来q行相应的修改,那么后期修改的代价就相当高了(jin)?/p>
解决Ҏ(gu)Q?/b>
现在有很多Java代码分析工具QFindBugs中开源项目当中的一个,它可以帮你找C码中隐藏的一些错误,提升你的代码能力与系l安全可靠性?/p>
安装
JDKQ?.5.0 从http://java.sun.com上去下蝲安装
EclipseQ?.1.1 从http://www.eclipse.org 上去下蝲解压
FindBugsQ?.9.4 从http://findbugs.sourceforge.net/
官方的文?http://findbugs.sourceforge.net/manual/
Eclipse plugin for FindBugs version 0.0.17 ?http://findbugs.sourceforge.net/downloads.html 下蝲
插g理技?/b>
提示Q新下蝲的插件PlugIn一定不要都攑֜原始的Eclipse目录下去?/p>
比如QE:\OpenSource\Eclipse\PlugInsNew\
那么在%ECLIPSE_HOME%\PlugInsNew\目录下徏立XYZ目录Q目录里面是eclipse目录Qeclipse目录包含有features与plugins两个子目录;l构如下图所C:(x)
%ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features
%ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins
然后?ECLIPSE_HOME%\links目录里徏立一个XYZ.link的文?
内容如是Qpath=E:/OpenSource/Eclipse/PlugInsNew/XYZ׃行这L(fng)路径指示而已?
当然Q采用相对\径来表示可能更直观一些,方便q行文g整体Ud和小l全部成员的׃n命名用,省得Ud后要改动Link文g里的l对路径而费?j)费力。直接拷贝过d可以使用?
即XYZ.link文g的内容如是:(x)path=../PlugInsNew/XYZ
q样Q如果你下蝲?jin)多个插件就可以如法炮制建立多个Link文gQ想加蝲哪个插g把哪个插g的Link文g攑ֈ%ECLIPSE_HOME%\links的目录中卛_Q用与理都很方便Q徏议千万不要放在默认的安装目录中;
如果你的%ECLIPSE_HOME%与此不同Q请修改XYZ.link文g里的路径
删除%ECLIPSE_HOME%\links\XYZ.link文g卛_
删除%ECLIPSE_HOME%\PlugInsNew\XYZ整个目录?qing)文?/p>
使用
重新启动Eclipse后,在Help => About Eclipse SDK => Plug-in Details你可以看到由“FindBugs Project”提供的“FindBugs Plug-in”版?.0.17插gQ如下图所C:(x)
FindBugs的用方?/b>
FindBugs是一个可以在JavaE序中发现Bugs的程序?
它是专门用来L处于“Bug Patterns”列表中的代码的?
Bug Patterns指很有可能是错误的代码的实例?/p>
目前FindBugs最高版?.9.4Q不q更新速度很快的,你应当经怸ȝ看是否有新版本发布。Eclipse plugin for FindBugs最高版?.0.17?/p>
pȝ要求
使用FindBugs臛_需要JDK1.4.0以上版本QFindBugs是^台独立的Q可以运行于GNU/Linux、Windows、MacOS X{^C?/p>
q行FindBugs臛_需要有256 MB内存Q如果你要分析一个很大的目Q那需要更加多的内存了(jin)?/p>
FindBugs独立q行和与Antl合的详l操作就不介l了(jin)Q可以看官方的文档http://findbugs.sourceforge.net/manual/
独立q行的效果图如下Q?/p>
打开Bug Details视图
Windows => Show View => Other?=> FindBugs => BugDetails
在Package Explorer或Navigator视图中,选中你的Java目Q右键,可以看到“Find Bugs”菜单项Q子菜单w有“Find Bugs”和“Clear Bug Markers”两内容,如下图所C:(x)
我们建立一个简单的试文gTest.java 内容如下Q?
public class Test { private String[] name; public String[] getName() { return name; } public void setName(String[] name) { this.name = name; } }
我们点中“Find Bugs”,q行时会(x)出现如下q度框:(x)
q行l束后可以在Problems中看到增加了(jin)如下的警告信息内?/p>
FindBugsq行后的警告信息内容不仅在Problems视图中显C,而且标记在源代码标记框中,在源代码~辑器中我们可以看到警告标识Q如下图Q?
当光标指向你的警告信息的代码上面Ӟ׃(x)有相应的错误提示信息Q与Eclipse本n的错误或警告信息提示cM?
选中Problems视图里出现的相应问题Q就?x)在代码~辑器里切换到相应的代码上去Q方便根据相应的提示信息q行代码的修攏V?
在Problems视图里,选中相应的问题条目,右键Q在弹出的菜单中Q可以看到“Show Bug Details”,如下图所C:(x)
点中它,?x)切换到Bug Details视图上去Q显C更加详l的提示信息?/p>
当然Q在代码~辑H口中,点击带有警告提示信息的图标时Q也?x)自动切换到Bud DetailsH口去,查看详细的警告信息,如下图所C?/p>
Ҏ(gu)q里详细的信息,你可以得到FindBugsZ么会(x)对你的代码报警告信息Q及(qing)相应的处理办法,Ҏ(gu)它的提示Q你可以快速方便地q行代码修改?/p>
Ҏ(gu)提示Q我们将代码修改成如下,再运行就不会(x)报有警告信息?jin)?/p>
public class Test { private String[] name; public String[] getName() { String[] temp = name; return temp; } public void setName(String[] name) { String[] temp = name; this.name = temp; } } 配置FindBugs
选择你的目Q右?=> Properties => FindBugs =>
可以配置的信息包括如上图所C的四个选项的相兌|:(x)
当此w中后,FindBugs会(x)在你修改JavacL自动q行Q如你设|了(jin)Eclipse自动~译开兛_Q当你修改完Java文g保存QFindBugs׃(x)q行Qƈ相应的信息昄出来?
当此Ҏ(gu)有选中Q你只能每次在需要的时候自己去q行FindBugs来检查你的代码?
q个选择Ҏ(gu)让你选择哪个U别的信息进行显C,有Low、Medium、High三个选择可以选择Q很cM于Log4J的别设|啦?比如Q?
你选择?jin)High选择,那么只有是HighU别的提CZ息才?x)被昄?
你选择?jin)Medium选择,那么只有是Medium和HighU别的提CZ息才?x)被昄?
你选择?jin)Low选择,那么所有别的提示信息都会(x)被显C?/p>
在这里是一些显CBug分类的选择Q?
Correctness关于代码正确性相x面的
Performance关于代码性能相关斚w?
Internationalization关于代码国际化相x面的
Multithreaded correctness关于代码多线E正性相x面的
Style关于代码样式相关斚w?/p>
Malicious code vulnerability关于恶意破坏代码相关斚w?
比如Q如果你把Style的检查框L不选择中它Q那么与Style分类相关的警告信息就不会(x)昄?jin)。其它的cM?/p>
在这里你可以选择所要进行检查的相关的Bug Pattern条目
可以从Bug codes、Detector name、Detector description中看到相应的是要(g)查哪些方面的内容Q你可以Ҏ(gu)需要选择或去掉相应的 (g)查条件?
ȝ
此插件的功能很不错,可以帮助我们提升Java代码的编写能力,写出更加安全可靠的代码。徏议用或加在Ant里进行持l构建。现在,你可以马上拿Z已经开发的一个项目,(g)查一下你的代码有没有问题?jin)?/p>