Eclipse get/set方法自动加上字段注释

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


    /** 
     * 员工ID 
     */  
    private String userid;  
    /** 
     * 获取员工ID 
     * @return userid 员工ID 
     */  
    public String getUserid() {  
        return userid;  
    }  
    /** 
     * 设置员工ID 
     * @param userid 员工ID 
     */  
    public void setUserid(String userid) {  
        this.userid = userid;  
    }  

关闭eclipse
找到Eclipse中Jar包:org.eclipse.jdt.ui_*.jar,进行备份

找到org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil.class
直接用附件中的class文件进行替换,重启Eclipse

设置注释风格:

Window->Preferences->Java->CodeStyle->Code Templates->Comments->Getters/Setters

Getters:

/**
* 获取${bare_field_name}
* @return ${bare_field_name} ${bare_field_name}
*/


Setters:

/**
* 设置${bare_field_name}
* @param ${bare_field_name} ${bare_field_name}
*/


注意:生成Get/Set方法时勾选上Generate method comments

OK,成功。


在eclipse4.2上测试通过。


原文:

http://superich2008.iteye.com/blog/1829868


替换GetterSetterUtil.class的原码:

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;

/**
 * @author yaku2688@126.com
 */
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;
			else
				fieldName = "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);
		else
			return 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;
		}
	}

}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值