自动生成构造方法、getter、setter
前言
一直很想知道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相关推荐
- IDEA自动生成 构造方法 get set方法
对于一个类,创建好成员变量后 右键单击,选中Generate 然后 这几个依次是 构造方法 get set get和set 我们可以选中一个,然后选中要生成的变量,点击OK 这样就可以自动生成 构成方 ...
- eclipse自动生成构造方法
1.在eclipse中单点需要生成构造方法的类,如下图 2.点击鼠标右键,选择 Source,再根据自己的需求选择生成有参/无参的构造方法 3.最终效果 3.1.有参的构造函数 3.2.无参的构造方法
- IJ 自动生成构造方法
alt+insert 选择要构造的对象
- [图解教程]Eclipse不可不知的用法之一:自动生成Getter、Setter和构造方法
[图解教程]Eclipse不可不知的用法之一:自动生成Getter.Setter和构造方法 关键词:Getters and Setters.getter和setter方法.Constructor us ...
- 【Groovy】Groovy 方法调用 ( Java 类成员及 setter 和 getter 方法设置 | Groovy 类自动生成成员的 getter 和 setter 方法 )
文章目录 一.Java 类成员及 setter 和 getter 方法设置 二.Groovy 类自动生成成员的 getter 和 setter 方法 一.Java 类成员及 setter 和 gett ...
- 玩转Eclipse — 自动生成setter和getter方法
我们在程序开发过程中,往往要编写这样的类:类的部分或者全部属性不希望让外部世界直接访问,而不用public字段修饰.这样,方法调用成了访问这些属性的唯一途径.JavaBean就是一个很好的例子,其严格 ...
- java插件开发_编写一个IDEA插件之:自动生成Java代码
我很喜欢IDEA的一键自动生成代码功能,例如自动生成构造方法.字段的Get/Set方法.ToString方法等等,除此之外,也有一些插件提供自动生成代码的功能,例如我们所熟悉的GsonFormat插件 ...
- 基于注解处理器开发自动生成getter和setter方法的插件
昨天无意中,逛到了lombok的网站,并看到了首页的5分钟视频,视频中的作者只是在实体类中写了几个字段,就可以自动编译为含setter.getter.toString()等方法的class文件.看着挺 ...
- android getter不起作用,java - 如何在Android Studio中自动生成getter和setter
java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...
- Objective-C 中自动生成 setter getter 方法
为什么80%的码农都做不了架构师?>>> 对于 C++ 这种语言,类中的私有成员变量需要自己去实现 setter 和 getter 方法.这种重复的东西其实没必要手动去完成,可 ...
最新文章
- 泊松图像融合(泊松融合)
- C#串口通信—传输文件测试
- 【Qt开发】V4L2 API详解 Buffer的准备和数据读取
- 怎么使用starwind部署iscsi_2019 年总结 - 多环境多版本的部署
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...
- Linux设备驱动模型3——platform平台总线工作原理
- LeetCode 5268. 找出两数组的不同(set)
- 关于找工作和选专业的思考
- linux多线程冗余,Linux 下的路径冗余
- 我用 Python 集齐了五福
- asp分页类--添加支持重写功能
- mysql where is_MySQL中条件放在where后面与放在on后面的区别
- [转]Vmware ESX 4上虚拟机 Redhat 5.2(CentOS 5.2)启动在Starting udev 停几个小时
- 4698. [SDOI2008]Sandy的卡片【后缀数组】
- Blender学习笔记:齿轮模型建立
- spark MLlib机器学习教程
- 歌声合成器-Yamaha Vocaloid 5.6.2 x64 WiN
- SQL中order by的高级用法
- 【Servlet篇】Response对象详细解读
- GNSS观测值质量分析必备基础知识
热门文章
- C# WPF框架从http协议上获取返回的json数据及其解析json数据
- PPPoE原理和实验
- 容器的六大误区和八大正确场景(颠覆你的认知)
- 使用tcpdump抓包工具来捕捉三次握手和四次挥手
- [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
- html_头部meta设置
- JavaScript 作用域
- IBM与西班牙桑坦德银行合作,推广企业级 iOS 银行应用
- iOS网络 AFN简单的下载 与 session下载带进度数据
- ++与*优先级相同,按照从右至左的顺序计算