Eclipse 設置生成帶有屬性注釋的getter/setter方法


1.  在開發中,一般類注釋常注釋在字段上面.但eclipse工具自動生成的getter和setter方法是沒有注釋的,而且還需要自己手動添加,這樣比較麻煩.下面介紹如何通過修改eclipse的jar包類實現這樣的功能.

首先看效果,在寫字段時,我們帶上了注釋,當自動生成getter和setter方法時,也會自動把字段上面的注釋生成了.這樣方便我們的開發和以后維護.

   /**
     * 創建人
     */
    private String createdBy;
    /**
     * 創建時間
     */
    private Date createdDate;
    
    /**
     * 獲取: 創建人
     */
    public String getCreatedBy() {
        return createdBy;
    }
    
    /**
     * 設置: 創建人
     */
    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }
    
    /**
     * 獲取: 創建時間
     */
    public Date getCreatedDate() {
        return createdDate;
    }
    
    /**
     * 設置: 創建時間
     */
    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

2.  好了,下面我們開始講解如何實現這樣的配置.首先,eclipse上面沒有自帶這樣的功能,所以我們需要通過修改eclipse的jar進行修改生成setter和getter的方法.

  1.  我們先找到eclipse的安裝目錄,找到這個jar包 : org.eclipse.jdt.ui_xxxxx.jar , xxxxx是一個版本號.例如我的是org.eclipse.jdt.ui_3.12.2.v20160929-0804.jar

  該jar所在目錄eclipse/plugins/

      2. 找到jar后,我們需要借用反編譯工具,具體哪個工具都行,我使用的是jd-gui(下載地址:http://jd.benow.ca/).

      3. 打開反編譯工具,把org.eclipse.jdt.ui_xxxxx.jar包進行反編譯,然后找到org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil類,保存生成對應的java文件

  4. 打開eclipse,創建一個java工程,把生成的GetterSetterUtil.java文件放到工程中,注意:請保持改java文件所在的包目錄為原來的目錄: package org.eclipse.jdt.internal.corext.codemanipulation;

  5. 把該java文件所關聯的一些jar包也引到項目中.具體使用了如下部分jar包,該部分的jar包都能在eclipse/plugins/目錄下能找到.具體版本請使用自己的eclipse里面的即可:

  

  6. 到此,一切已准備就緒,接下來就是關鍵的時刻了. 在GetterSetterUtil.java類中找到getSetterStub和getGetterStub方法,然后分別在如下地方添加紅框部分代碼

紅框的代碼如下:

    ISourceRange sr = field.getJavadocRange();
      if (sr != null)
      {
        String fieldComment = field.getSource().substring(0, sr.getLength()).replaceAll("/", "").replaceAll("\\*", "").trim();
        comment = comment.replaceAll("bare_field_comment", fieldComment);
      }
      else
      {
        String str = getLineComment((SourceField)field);
        if (str != null) {
          comment = comment.replaceAll("bare_field_comment", str);
        }
      }

  

  在該類后面添加該部分代碼調用的getLineComment方法:

public static String getLineComment(SourceField field) throws JavaModelException {
		ISourceRange range = field.getSourceRange();
		if (range == null) {
			return null;
		}
		IBuffer buf = null;
		if (field.isBinary()) {
			buf = field.getClassFile().getBuffer();
		} else {
			ICompilationUnit compilationUnit = field.getCompilationUnit();
			if (!compilationUnit.isConsistent()) {
				return null;
			}
			buf = compilationUnit.getBuffer();
		}
		int start = range.getOffset();
		int length = range.getLength();
		if ((length > 0) && (buf.getChar(start) == '/')) {
			IScanner scanner = ToolFactory.createScanner(true, false, false, false);
			try {
				scanner.setSource(buf.getText(start, length).toCharArray());
				int docOffset = -1;
				int docEnd = -1;

				int terminal = scanner.getNextToken();
				switch (terminal) {
				case 1003:
					terminal = scanner.getNextToken();
					break;
				case 1001:
					docOffset = scanner.getCurrentTokenStartPosition();
					docEnd = scanner.getCurrentTokenEndPosition() + 1;
					terminal = scanner.getNextToken();
					break;
				case 1002:
					terminal = scanner.getNextToken();
				}
				if (docOffset != -1) {
					SourceRange sr = new SourceRange(docOffset + start, docEnd - docOffset);
					String str = field.getSource().substring(0, sr.getLength());
					char[] c = str.toCharArray();
					int beginIndex = 0;
					char[] arrayOfChar1;
					int j = (arrayOfChar1 = c).length;
					for (int i = 0; i < j; i++) {
						char cr = arrayOfChar1[i];
						if (cr != '/') {
							break;
						}
						beginIndex++;
					}
					return str.substring(beginIndex).trim();
				}
			} catch (InvalidInputException localInvalidInputException) {
			} catch (IndexOutOfBoundsException localIndexOutOfBoundsException) {
			}
		}
		return null;
	}

  注意:加入的代碼可能需要在GetterSetterUtil.java類引入一些包,為了大家方便,我把我引入的包貼一下方便大家查找:

import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.ISourceRange;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.NamingConventions;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.core.SourceRange;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.compiler.IScanner;
import org.eclipse.jdt.core.compiler.InvalidInputException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.CastExpression;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
import org.eclipse.jdt.core.dom.InfixExpression;
import org.eclipse.jdt.core.dom.NumberLiteral;
import org.eclipse.jdt.core.dom.ParenthesizedExpression;
import org.eclipse.jdt.core.dom.PostfixExpression;
import org.eclipse.jdt.core.dom.PrefixExpression;
import org.eclipse.jdt.core.dom.PrimitiveType;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.internal.core.SourceField;
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
import org.eclipse.jdt.internal.corext.dom.NecessaryParenthesesChecker;
import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
import org.eclipse.jdt.internal.corext.util.JdtFlags;
import org.eclipse.jdt.ui.CodeGeneration;

修改完畢后,編譯項目,然后找到編譯出來的GetterSetterUtil.class文件.再通過壓縮工具把GetterSetterUtil.class文件替換org.eclipse.jdt.ui_xxxxx.jar包中的GetterSetterUtil.class.

然后再把org.eclipse.jdt.ui_xxxxx.jar包替換eclipse/plugins/下的對應jar包.(注:替換前請備份,不然如果出問題了就悲劇了!!!)

7. 重啟eclipse,打開Window > Preferences > Java > Code Style > Code Templates然后在comments中分別設置Getters和Setters,如下圖:

 

 到此,大功告成啦! 

 

8. 如果覺得反編譯麻煩,那大家也可以到網上找被人反編譯修改好的GetterSetterUtil.class文件或者org.eclipse.jdt.ui_xxxxx.jar 包來替換自己eclipse下的jar包.但是一定要注意版本一致,不然就會出錯的

 

我使用的eclipse Neon.3 Release (4.6.3),如果有和我一樣的版本,那可以直接下載我修改后的使用:

GetterSetterUtil.class  (下載這個需要自己去替換org.eclipse.jdt.ui_3.12.2.v20160929-0804.jar包中的對應class文件)

org.eclipse.jdt.ui_3.12.2.v20160929-0804.jar (推薦)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM