前言

​ 一直很想知道IDE是如何自动去生成类的构造和getter、setter方法,大概是有个想法,获取当前的类,利用反射去获取属性名和类型,然后生成,所以我想自己试试。

写个模板类

package common;public class Templates {public static final String T_CLASS      = "package {0};\n\n{1}public class {2} {\n\n{3}\n\n{5}\n\n{4}\n}";public static final String T_GET        = "\tpublic {0} get{1} () {\n\t\treturn {2};\n\t}\n";public static final String T_SET        = "\tpublic void set{0}({1} {2}) {\n\t\tthis.{2}={2};\n\t}\n";public static final String T_ATTR1      = "\tprivate {0} {1};\n";public static final String T_ATTR2      = "\t\tthis.{0}={0};\n";public static final String T_IMPORT     = "import java.util.Date;\n\n";public static final String T_CONSTRUCT  = "\tpublic {0}({1}) {\n\t\tsuper();\n{2}\n\t}\n";public static String format(String pattern, String ... arguments){String format = pattern;for(int i=0;i<arguments.length;i++){format = format.replace("{"+i+"}",arguments[i]);}return format;}public static String loadTemplate(String clazz,String pack,String port,String attrs,String get_set,String construct){return format(T_CLASS, clazz,pack,port,attrs,get_set,construct);}
}

创建一个实体类

package cc.vvxtoys.pojo;public class Student {private int id;private String name;private String sex;private String school;}

工具类

package common;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;import org.apache.log4j.Logger;public class Common {private static Logger log = Logger.getLogger(Common.class);//获得绝对路径public static String absolutePath(String pack, String name, String suffix) {List<String> list = new ArrayList<>();String absolutePath = "";try {String packPath = pack.replace(".", "\\");File src = new File(".\\src");File file = new File(src.getCanonicalPath());File[] fs = file.listFiles();for (int i = 0; i < fs.length; i++) {if (fs[i].isDirectory()) {if (fs[i].getAbsolutePath().endsWith(packPath)) {absolutePath = fs[i].getAbsolutePath() + "\\" + name + suffix;return absolutePath;}list.add(fs[i].getAbsolutePath());}}for (int j = 0; j < Integer.MAX_VALUE; j++) {if (j>0&&j == list.size() - 1) {break;}File tmp = new File(list.get(j));fs = tmp.listFiles();for (int k = 0; k < fs.length; k++) {if (fs[k].isDirectory()) {if (fs[k].getAbsolutePath().endsWith(packPath)) {absolutePath = fs[k].getAbsolutePath() + "\\" + name + suffix;return absolutePath;}list.add(fs[k].getAbsolutePath());}}}} catch (Exception e) {e.printStackTrace();}return absolutePath;}public static String loadFile(String path) {File file = new File(path);String str = null;BufferedReader reader = null;StringBuffer buffer = new StringBuffer();String charset = "utf-8";try {InputStreamReader is = new InputStreamReader(new FileInputStream(file), charset);reader = new BufferedReader(is);while ((str = reader.readLine()) != null) {buffer.append(str);buffer.append("\n");}} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (Exception e) {e.printStackTrace();}}}return buffer.toString();}public static void writeFile(String filePath, String str, boolean flg) {try {FileWriter fw = new FileWriter(new File(filePath), flg);PrintWriter pw = new PrintWriter(fw);pw.println(str);log.info("写入成功。。。");pw.close();} catch (IOException e) {e.printStackTrace();}}public static void writeFile(String filePath, String str) {try {FileWriter fw = new FileWriter(new File(filePath), true);PrintWriter pw = new PrintWriter(fw);pw.println(str);log.info("写入成功。。。");pw.close();} catch (IOException e) {e.printStackTrace();}}//首字母大写public static String upInitials(String str){StringBuffer buff = new StringBuffer();buff.append(String.valueOf(str.charAt(0)).toUpperCase());buff.append(str.toCharArray(),1,str.length()-1);return buff.toString();}
}

构建类

package auto_get_set;import java.lang.reflect.Field;import common.Common;
import common.Templates;
/*** @author vvxtoys*/
public class ClassGenerator {private String [] attrs;private String [] types;private String absolutePath;private String context;private String clazz;public ClassGenerator(Object obj) {loadClass(obj);}public void loadClass(Object obj){Field [] fs = null;try{String claname = obj.getClass().getSimpleName();String suffix = ".java";String pack   = obj.getClass().getPackage().getName();absolutePath = Common.absolutePath(pack, claname, suffix);context = Common.loadFile(absolutePath);clazz = claname;Class clazz = Class.forName(obj.getClass().getName());fs = clazz.getDeclaredFields();attrs = new String[fs.length];types = new String[fs.length];for(int i=0;i<fs.length;i++){attrs[i] = fs[i].getName();types[i] = fs[i].getType().getSimpleName();}}catch(Exception e){e.printStackTrace();}}public void autoGetSet(){String str = context.substring(0,context.lastIndexOf("}"));String get_set = "";for(int i=0;i<attrs.length;i++){String g1 = Templates.format(Templates.T_GET, types[i],Common.upInitials(attrs[i]),attrs[i]);String s1 = Templates.format(Templates.T_SET, Common.upInitials(attrs[i]),types[i],attrs[i]);get_set+=g1+s1;}str+=get_set;str+="}";context = str;}public void autoConstruct(){String str = context.substring(0,context.lastIndexOf("}"));String c1 = Templates.format(Templates.T_CONSTRUCT, clazz,"","");String params = "";String field = "";for(int i=0;i<attrs.length;i++){params+=types[i]+" "+attrs[i]+",";field+=Templates.format(Templates.T_ATTR2, attrs[i]);}params = params.substring(0,params.length()-1);String c2 = Templates.format(Templates.T_CONSTRUCT, clazz,params,field);str +=c1+c2;str+="}";context = str;}public void updateClass(){Common.writeFile(absolutePath, context,false);}public void run(){autoConstruct();autoGetSet();updateClass();}}

测试

package auto_get_set;import cc.vvxtoys.pojo.Student;public class Test {public static void main(String[] args) {ClassGenerator g = new ClassGenerator(new Student());g.run();    }}

构建之后的实体类

package cc.vvxtoys.pojo;public class Student {private int id;private String name;private String sex;private String school;public Student() {super();}public Student(int id,String name,String sex,String school) {super();this.id=id;this.name=name;this.sex=sex;this.school=school;}public int getId () {return id;}public void setId(int id) {this.id=id;}public String getName () {return name;}public void setName(String name) {this.name=name;}public String getSex () {return sex;}public void setSex(String sex) {this.sex=sex;}public String getSchool () {return school;}public void setSchool(String school) {this.school=school;}
}

结束

写写停停大概也是花费了两天的时间,东西虽然很小,也还有bug,但是还是有点成就感的。我知道IDE肯定不可能用这么蠢得实现方式,但是以我现在的想法只能这样了,还是需要多学点东西,然后我再重构这些代码。

转载于:https://www.cnblogs.com/vvxtoys/p/9226429.html

自动生成构造方法、getter、setter相关推荐

  1. IDEA自动生成 构造方法 get set方法

    对于一个类,创建好成员变量后 右键单击,选中Generate 然后 这几个依次是 构造方法 get set get和set 我们可以选中一个,然后选中要生成的变量,点击OK 这样就可以自动生成 构成方 ...

  2. eclipse自动生成构造方法

    1.在eclipse中单点需要生成构造方法的类,如下图 2.点击鼠标右键,选择 Source,再根据自己的需求选择生成有参/无参的构造方法 3.最终效果 3.1.有参的构造函数 3.2.无参的构造方法

  3. IJ 自动生成构造方法

    alt+insert 选择要构造的对象

  4. [图解教程]Eclipse不可不知的用法之一:自动生成Getter、Setter和构造方法

    [图解教程]Eclipse不可不知的用法之一:自动生成Getter.Setter和构造方法 关键词:Getters and Setters.getter和setter方法.Constructor us ...

  5. 【Groovy】Groovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )

    文章目录 一.Java 类成员及 setter 和 getter 方法设置 二.Groovy 类自动生成成员的 getter 和 setter 方法 一.Java 类成员及 setter 和 gett ...

  6. 玩转Eclipse — 自动生成setter和getter方法

    我们在程序开发过程中,往往要编写这样的类:类的部分或者全部属性不希望让外部世界直接访问,而不用public字段修饰.这样,方法调用成了访问这些属性的唯一途径.JavaBean就是一个很好的例子,其严格 ...

  7. java插件开发_编写一个IDEA插件之:自动生成Java代码

    我很喜欢IDEA的一键自动生成代码功能,例如自动生成构造方法.字段的Get/Set方法.ToString方法等等,除此之外,也有一些插件提供自动生成代码的功能,例如我们所熟悉的GsonFormat插件 ...

  8. 基于注解处理器开发自动生成getter和setter方法的插件

    昨天无意中,逛到了lombok的网站,并看到了首页的5分钟视频,视频中的作者只是在实体类中写了几个字段,就可以自动编译为含setter.getter.toString()等方法的class文件.看着挺 ...

  9. android getter不起作用,java - 如何在Android Studio中自动生成getter和setter

    java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...

  10. Objective-C 中自动生成 setter getter 方法

    为什么80%的码农都做不了架构师?>>>    对于 C++ 这种语言,类中的私有成员变量需要自己去实现 setter 和 getter 方法.这种重复的东西其实没必要手动去完成,可 ...

最新文章

  1. 泊松图像融合(泊松融合)
  2. C#串口通信—传输文件测试
  3. 【Qt开发】V4L2 API详解 Buffer的准备和数据读取
  4. 怎么使用starwind部署iscsi_2019 年总结 - 多环境多版本的部署
  5. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...
  6. Linux设备驱动模型3——platform平台总线工作原理
  7. LeetCode 5268. 找出两数组的不同(set)
  8. 关于找工作和选专业的思考
  9. linux多线程冗余,Linux  下的路径冗余
  10. 我用 Python 集齐了五福
  11. asp分页类--添加支持重写功能
  12. mysql where is_MySQL中条件放在where后面与放在on后面的区别
  13. [转]Vmware ESX 4上虚拟机 Redhat 5.2(CentOS 5.2)启动在Starting udev 停几个小时
  14. 4698. [SDOI2008]Sandy的卡片【后缀数组】
  15. Blender学习笔记:齿轮模型建立
  16. spark MLlib机器学习教程
  17. 歌声合成器-Yamaha Vocaloid 5.6.2 x64 WiN
  18. SQL中order by的高级用法
  19. 【Servlet篇】Response对象详细解读
  20. GNSS观测值质量分析必备基础知识

热门文章

  1. C# WPF框架从http协议上获取返回的json数据及其解析json数据
  2. PPPoE原理和实验
  3. 容器的六大误区和八大正确场景(颠覆你的认知)
  4. 使用tcpdump抓包工具来捕捉三次握手和四次挥手
  5. [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
  6. html_头部meta设置
  7. JavaScript 作用域
  8. IBM与西班牙桑坦德银行合作,推广企业级 iOS 银行应用
  9. iOS网络 AFN简单的下载 与 session下载带进度数据
  10. ++与*优先级相同,按照从右至左的顺序计算