eclipse生成带注释的set、get方法

来源:互联网 发布:java web爬虫框架 编辑:程序博客网 时间:2024/06/17 23:46

转载出处:http://blog.csdn.net/luotangsha/article/details/7016613

编码的时候通常要用到 JavaBean ,而在我们经常把注释写在字段上面,但生成的Get/Set方法不会生成,通过修改源码可解决。


效果如下:

  1. /**  
  2.  * 员工ID  
  3.  */  
  4. private String userid;   
  5. /**  
  6.  * 获取员工ID  
  7.  * @return userid 员工ID  
  8.  */  
  9. public String getUserid() {   
  10.     return userid;   
  11. }   
  12. /**  
  13.  * 设置员工ID  
  14.  * @param userid 员工ID  
  15.  */  
  16. public void setUserid(String userid) {   
  17.     this.userid = userid;   
  18. }  

解决方案如下:

通过反编译技术,修改ECLIPSE的org.eclipse.jdt.ui_3.3.1.r331_v20070906.jar包中的
org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil类
下的getSetterStub及getGetterStub函数,来实现生成getter/setter时,注释使用成员的注释(如果成员的注释有的话,如果没有则使用注释模板生成,如果选择了生成getter/setter需要生成code comment的话)

getSetterStub函数修改的地方为:
将原:
  if(addComments)
  {
  String comment = CodeGeneration.getSetterComment(field.getCompilationUnit(), parentType.getTypeQualifiedName('.'), setterName, field.getElementName(), typeName, argname, accessorName, lineDelim);

修改为:
  if(addComments)
  {
  String comment = CodeGeneration.getSetterComment(field.getCompilationUnit(), parentType.getTypeQualifiedName('.'), setterName, field.getElementName(), typeName, argname, accessorName, lineDelim);
  ISourceRange sr = field.getJavadocRange();
  if( null != sr )
  comment = field.getSource().substring( 0, sr.getLength() );


getGetterStub函数修改的地方为:
将原:
  if(addComments)
  {
  String comment = CodeGeneration.getGetterComment(field.getCompilationUnit(), parentType.getTypeQualifiedName('.'), getterName, field.getElementName(), typeName, accessorName, lineDelim);

修改为:
  if(addComments)
  {
  String comment = CodeGeneration.getGetterComment(field.getCompilationUnit(), parentType.getTypeQualifiedName('.'), getterName, field.getElementName(), typeName, accessorName, lineDelim);
  ISourceRange sr = field.getJavadocRange();
  if( null != sr )
  comment = field.getSource().substring( 0, sr.getLength() );


修改好的GetterSetterUtil类如下:

package org.eclipse.jdt.internal.corext.codemanipulation;import org.eclipse.core.runtime.CoreException;import org.eclipse.jdt.core.*;import org.eclipse.jdt.core.dom.*;import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;import org.eclipse.jdt.internal.corext.dom.ASTNodes;import org.eclipse.jdt.internal.corext.util.JavaModelUtil;import org.eclipse.jdt.internal.corext.util.JdtFlags;import org.eclipse.jdt.ui.CodeGeneration;public class GetterSetterUtil {private static final String EMPTY[] = new String[0];private GetterSetterUtil() {}public static String getGetterName(IField field, String excludedNames[])throws JavaModelException {boolean useIs = StubUtility.useIsForBooleanGetters(field.getJavaProject());return getGetterName(field, excludedNames, useIs);}private static String getGetterName(IField field, String excludedNames[],boolean useIsForBoolGetters) throws JavaModelException {if (excludedNames == null)excludedNames = EMPTY;return getGetterName(field.getJavaProject(), field.getElementName(),field.getFlags(), useIsForBoolGetters&& JavaModelUtil.isBoolean(field), excludedNames);}public static String getGetterName(IVariableBinding variableType,IJavaProject project, String excludedNames[], boolean isBoolean) {boolean useIs = StubUtility.useIsForBooleanGetters(project)&& isBoolean;return getGetterName(project, variableType.getName(), variableType.getModifiers(), useIs, excludedNames);}public static String getGetterName(IJavaProject project, String fieldName,int flags, boolean isBoolean, String excludedNames[]) {return NamingConventions.suggestGetterName(project, fieldName, flags,isBoolean, excludedNames);}public static String getSetterName(IVariableBinding variableType,IJavaProject project, String excludedNames[], boolean isBoolean) {return getSetterName(project, variableType.getName(), variableType.getModifiers(), isBoolean, excludedNames);}public static String getSetterName(IJavaProject project, String fieldName,int flags, boolean isBoolean, String excludedNames[]) {return NamingConventions.suggestSetterName(project, fieldName, flags,isBoolean, excludedNames);}public static String getSetterName(IField field, String excludedNames[])throws JavaModelException {if (excludedNames == null)excludedNames = EMPTY;return NamingConventions.suggestSetterName(field.getJavaProject(),field.getElementName(), field.getFlags(), JavaModelUtil.isBoolean(field), excludedNames);}public static IMethod getGetter(IField field) throws JavaModelException {String getterName = getGetterName(field, EMPTY, true);IMethod primaryCandidate = JavaModelUtil.findMethod(getterName,new String[0], false, field.getDeclaringType());if (!JavaModelUtil.isBoolean(field) || primaryCandidate != null&& primaryCandidate.exists()) {return primaryCandidate;} else {String secondCandidateName = getGetterName(field, EMPTY, false);return JavaModelUtil.findMethod(secondCandidateName, new String[0],false, field.getDeclaringType());}}public static IMethod getSetter(IField field) throws JavaModelException {String args[] = { field.getTypeSignature() };return JavaModelUtil.findMethod(getSetterName(field, EMPTY), args,false, field.getDeclaringType());}/** * Set方法注释 * @param field * @param setterName * @param addComments * @param flags * @return * @throws CoreException */public static String getSetterStub(IField field, String setterName,boolean addComments, int flags) throws CoreException {String fieldName = field.getElementName();IType parentType = field.getDeclaringType();String returnSig = field.getTypeSignature();String typeName = Signature.toString(returnSig);IJavaProject project = field.getJavaProject();String accessorName = NamingConventions.removePrefixAndSuffixForFieldName(project, fieldName, field.getFlags());String argname = StubUtility.suggestArgumentName(project, accessorName,EMPTY);boolean isStatic = Flags.isStatic(flags);boolean isSync = Flags.isSynchronized(flags);boolean isFinal = Flags.isFinal(flags);String lineDelim = "\n";StringBuffer buf = new StringBuffer();if (addComments) {String comment = CodeGeneration.getSetterComment(field.getCompilationUnit(),parentType.getTypeQualifiedName('.'),setterName, field.getElementName(), typeName, argname, accessorName,lineDelim);ISourceRange sr = field.getJavadocRange();if (null != sr) {String filedComment = field.getSource();filedComment = filedComment.substring(0, sr.getLength());filedComment = filedComment.replaceAll("[\n,\r,*,/, ,\t]", "");comment = comment.replaceFirst(field.getElementName(), filedComment);    int i = comment.lastIndexOf(field.getElementName());int j = getCount(comment, field.getElementName());if (i != -1 && j >= 2) {comment = comment.substring(0, i) + filedComment + comment.substring(i + field.getElementName().length());}}if (comment != null) {buf.append(comment);buf.append(lineDelim);}}buf.append(JdtFlags.getVisibilityString(flags));buf.append(' ');if (isStatic)buf.append("static ");if (isSync)buf.append("synchronized ");if (isFinal)buf.append("final ");buf.append("void ");buf.append(setterName);buf.append('(');buf.append(typeName);buf.append(' ');buf.append(argname);buf.append(") {");buf.append(lineDelim);boolean useThis = StubUtility.useThisForFieldAccess(project);if (argname.equals(fieldName) || useThis && !isStatic)if (isStatic)fieldName = parentType.getElementName() + '.' + fieldName;elsefieldName = "this." + fieldName;String body = CodeGeneration.getSetterMethodBodyContent(field.getCompilationUnit(), parentType.getTypeQualifiedName('.'),setterName, fieldName, argname, lineDelim);if (body != null)buf.append(body);buf.append("}");buf.append(lineDelim);return buf.toString();}/** * Get方法注释 * @param field * @param getterName * @param addComments * @param flags * @return * @throws CoreException */public static String getGetterStub(IField field, String getterName,boolean addComments, int flags) throws CoreException {String fieldName = field.getElementName();IType parentType = field.getDeclaringType();boolean isStatic = Flags.isStatic(flags);boolean isSync = Flags.isSynchronized(flags);boolean isFinal = Flags.isFinal(flags);String typeName = Signature.toString(field.getTypeSignature());String accessorName = NamingConventions.removePrefixAndSuffixForFieldName(field.getJavaProject(), fieldName, field.getFlags());String lineDelim = "\n";StringBuffer buf = new StringBuffer();if (addComments) {//field.getCompilationUnit() 得到当前类文件内容,就是要get,set的东西//parentType.getTypeQualifiedName('.') 得到类名//getterName 拼出get的方法名//field.getElementName() 得到字段名//typeName 类型String comment= CodeGeneration.getGetterComment(field.getCompilationUnit(),parentType.getTypeQualifiedName('.'),getterName,field.getElementName(),typeName, accessorName, lineDelim);ISourceRange sr = field.getJavadocRange();  if( null != sr ) {  String filedComment = field.getSource();  filedComment = filedComment.substring(0, sr.getLength());  filedComment = filedComment.replaceAll("[\n,\r,*,/, ,\t]", "");  comment = comment.replaceFirst(field.getElementName(), filedComment);      int i = comment.lastIndexOf(field.getElementName());  int j = getCount(comment, field.getElementName());  if (i != -1 && j >= 2) {  comment = comment.substring(0, i) + filedComment + comment.substring(i + field.getElementName().length());  }  }  if (comment != null) {buf.append(comment);buf.append(lineDelim);}}buf.append(JdtFlags.getVisibilityString(flags));buf.append(' ');if (isStatic)buf.append("static ");if (isSync)buf.append("synchronized ");if (isFinal)buf.append("final ");buf.append(typeName);buf.append(' ');buf.append(getterName);buf.append("() {");buf.append(lineDelim);boolean useThis = StubUtility.useThisForFieldAccess(field.getJavaProject());if (useThis && !isStatic)fieldName = "this." + fieldName;String body = CodeGeneration.getGetterMethodBodyContent(field.getCompilationUnit(), parentType.getTypeQualifiedName('.'), getterName, fieldName, lineDelim);if (body != null)buf.append(body);buf.append("}");buf.append(lineDelim);return buf.toString();}private static int getCount(String str, String sign) {// 查找某一字符串中str,特定子串sign的出现次数if (str == null)return 0;double i = str.length();str = str.replaceAll(sign, "");// 将串中的字符sign替换成""return (int) (i - str.length()) / sign.length();}public static Expression getAssignedValue(ASTNode node,ASTRewrite astRewrite, Expression getterExpression,ITypeBinding variableType, boolean is50OrHigher) {org.eclipse.jdt.core.dom.InfixExpression.Operator op = null;AST ast = astRewrite.getAST();if (isNotInBlock(node))return null;if (node.getNodeType() == 7) {Assignment assignment = (Assignment) node;Expression rightHandSide = assignment.getRightHandSide();Expression copiedRightOp = (Expression) astRewrite.createCopyTarget(rightHandSide);if (assignment.getOperator() == org.eclipse.jdt.core.dom.Assignment.Operator.ASSIGN) {ITypeBinding rightHandSideType = rightHandSide.resolveTypeBinding();copiedRightOp = createNarrowCastIfNessecary(copiedRightOp,rightHandSideType, ast, variableType, is50OrHigher);return copiedRightOp;}if (getterExpression != null) {InfixExpression infix = ast.newInfixExpression();infix.setLeftOperand(getterExpression);infix.setOperator(ASTNodes.convertToInfixOperator(assignment.getOperator()));infix.setRightOperand(copiedRightOp);ITypeBinding infixType = infix.resolveTypeBinding();return createNarrowCastIfNessecary(infix, infixType, ast,variableType, is50OrHigher);}} else if (node.getNodeType() == 37) {PostfixExpression po = (PostfixExpression) node;if (po.getOperator() == org.eclipse.jdt.core.dom.PostfixExpression.Operator.INCREMENT)op = org.eclipse.jdt.core.dom.InfixExpression.Operator.PLUS;if (po.getOperator() == org.eclipse.jdt.core.dom.PostfixExpression.Operator.DECREMENT)op = org.eclipse.jdt.core.dom.InfixExpression.Operator.MINUS;} else if (node.getNodeType() == 38) {PrefixExpression pe = (PrefixExpression) node;if (pe.getOperator() == org.eclipse.jdt.core.dom.PrefixExpression.Operator.INCREMENT)op = org.eclipse.jdt.core.dom.InfixExpression.Operator.PLUS;if (pe.getOperator() == org.eclipse.jdt.core.dom.PrefixExpression.Operator.DECREMENT)op = org.eclipse.jdt.core.dom.InfixExpression.Operator.MINUS;}if (op != null && getterExpression != null)return createInfixInvocationFromPostPrefixExpression(op,getterExpression, ast, variableType, is50OrHigher);elsereturn null;}private static boolean isNotInBlock(ASTNode parent) {ASTNode statement = parent.getParent();boolean isStatement = statement.getNodeType() != 21;ASTNode block = statement.getParent();boolean isBlock = block.getNodeType() == 8 || block.getNodeType() == 50;boolean isControlStatemenBody = ASTNodes.isControlStatementBody(statement.getLocationInParent());return isStatement || !isBlock && !isControlStatemenBody;}private static Expression createInfixInvocationFromPostPrefixExpression(org.eclipse.jdt.core.dom.InfixExpression.Operator operator,Expression getterExpression, AST ast, ITypeBinding variableType,boolean is50OrHigher) {InfixExpression infix = ast.newInfixExpression();infix.setLeftOperand(getterExpression);infix.setOperator(operator);NumberLiteral number = ast.newNumberLiteral();number.setToken("1");infix.setRightOperand(number);ITypeBinding infixType = infix.resolveTypeBinding();return createNarrowCastIfNessecary(infix, infixType, ast, variableType,is50OrHigher);}private static Expression createNarrowCastIfNessecary(Expression expression, ITypeBinding expressionType, AST ast,ITypeBinding variableType, boolean is50OrHigher) {PrimitiveType castTo = null;if (variableType.isEqualTo(expressionType))return expression;if (is50OrHigher) {if (ast.resolveWellKnownType("java.lang.Character").isEqualTo(variableType))castTo = ast.newPrimitiveType(PrimitiveType.CHAR);if (ast.resolveWellKnownType("java.lang.Byte").isEqualTo(variableType))castTo = ast.newPrimitiveType(PrimitiveType.BYTE);if (ast.resolveWellKnownType("java.lang.Short").isEqualTo(variableType))castTo = ast.newPrimitiveType(PrimitiveType.SHORT);}if (ast.resolveWellKnownType("char").isEqualTo(variableType))castTo = ast.newPrimitiveType(PrimitiveType.CHAR);if (ast.resolveWellKnownType("byte").isEqualTo(variableType))castTo = ast.newPrimitiveType(PrimitiveType.BYTE);if (ast.resolveWellKnownType("short").isEqualTo(variableType))castTo = ast.newPrimitiveType(PrimitiveType.SHORT);if (castTo != null) {CastExpression cast = ast.newCastExpression();if (ASTNodes.needsParentheses(expression)) {ParenthesizedExpression parenthesized = ast.newParenthesizedExpression();parenthesized.setExpression(expression);cast.setExpression(parenthesized);} else {cast.setExpression(expression);}cast.setType(castTo);return cast;} else {return expression;}}}

可以将此GetterSetterUtil类编译成class文件,替换org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil的class类即可

设置生成模板
1、preferences-->Java-->Code Style-->Code Templates,Getters、Setters 编辑一下  

生成getter 和setter方法倒很容易啊
1、类-定义变量-右键-Source-Generate Getter and Setter  
2、选择变量-选择位置-选中Generate method comments-OK






阅读全文
0 0
原创粉丝点击