前言

​ 一直很想知道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肯定不可能用这么蠢得实现方式,但是以我现在的想法只能这样了,还是需要多学点东西,然后我再重构这些代码。

自动生成构造方法、getter、setter的更多相关文章

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

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

  2. android studio: 快捷键生成getter/setter方法时自动加m的问题

    平时使用Android Studio 在写实体类的时候,习惯给实体类的成员变量前面加上一个"m" 修饰符表示这是一个成员变量,这也是搞java的一种约定俗成的写法,本来这是没有问题 ...

  3. Eclipse 设置生成带有属性注释的getter/setter方法

    1.  在开发中,一般类注释常注释在字段上面.但eclipse工具自动生成的getter和setter方法是没有注释的,而且还需要自己手动添加,这样比较麻烦.下面介绍如何通过修改eclipse的jar ...

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

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

  5. 属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter

    属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter 一.普通的get 和set 属性. 一般的get 和set 属 ...

  6. 自动生成getter setter

    如何使用java黑魔法给一个entity生成getter,setter方法? 由于java是一门静态语言,要给一个类动态添加方法,看似是不可能的.但牛B的程序员会让任何事情发生.我只知道有两种方式可以 ...

  7. OC知识点(类方法,构造方法,组合模式,get,set方法,自动生成属性)

    1.类方法的优势 不用创建对象,节省了空间,直接用类名调用类方法,类方法为外界提供一个方便的调用接口.(特点:类方法以加号开头,不能使用自身的成员变量,它的调用不依赖成员变量) 2.构造方法(初始化成 ...

  8. 什么是静态代码块?java中如何使用空参构造方法自动生成不同名字的对象,使用非静态的属性和静态属性有什么区别,原因是什么?如何理解static关键字

    静态代码块?类加载就执行,最先执行 class demo{ static int num; static{ num=10; num*=3; System.out.println("haha& ...

  9. 使用mybatis-generator自动生成model、dao、mapping文件

    参考文献:http://www.cnblogs.com/smileberry/p/4145872.html 一.所需库 1.mybatis-generator库 2.连接DB的驱动(此以mysql为例 ...

随机推荐

  1. ORB_SLAM2安装

    进入工程目录,我们发现有两个sh文件,一个是build.sh另一个是build_ros.sh. 这两个都可以进行ORB_SLAM2的安装,我们先来看一下build.sh echo "Conf ...

  2. zznuoj 1540 : 直线与圆

    题目描述 给出一个圆的圆心坐标与圆的半径,和一条直线上的两点坐标,求这条直线与圆有多少个交点. 输入 输入3个实数x,y,r值分别表示圆心坐标与圆的半径,输入4个实数x1,y1,x2,y2表示直线上的 ...

  3. C#取出重复的方式以及用字典存储以键存储集合的方法

    最近在做项目的时候,发现有些需求需要特别的方式来实现.下面看代码 private List<string> firstType = new List<string>(); pr ...

  4. 前端AES解密

    使用插件Crypto.JS 安装 npm install --save_dev crypto-js // 导入 crypto-js 包 import CryptoJS from 'crypto-js/ ...

  5. 2018-2019-2 20165313 Exp2 后门原理与实践

    实践基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 应用程序设定后门,用户安装后,后门就可以进入.例如课堂上讲到的百度. (2)例举你知道的后门如何启动起来(win及linux) ...

  6. LG3211 [HNOI2011]XOR和路径

    题意 题目描述 给定一个无向连通图,其节点编号为 1 到 N,其边的权值为非负整数.试求出一条从 1 号节点到 N 号节点的路径,使得该路径上经过的边的权值的"XOR 和"最大.该 ...

  7. 密码疑云 (3)——详解RSA的加密与解密

    上一篇文章介绍了RSA涉及的数学知识,本章将应用这些知识详解RSA的加密与解密. RSA算法的密钥生成过程 密钥的生成是RSA算法的核心,它的密钥对生成过程如下: 1. 选择两个不相等的大素数p和q, ...

  8. 关于sql 索引

    1.聚集索引一个表只能有一个,而非聚集索引有个表能有多个 2.聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么 ...

  9. Ubuntu 18.04 启用 rc.local 设置开机启动

    ubuntu18.04 不再使用initd管理系统,改用systemd. 然而systemd很难用,改变太大,跟之前的完全不同. 使用systemd设置开机启动为了像以前一样,在/etc/rc.loc ...

  10. excel表格公式无效、不生效的解决方案及常见问题、常用函数

    1.表格公式无效.不生效 使用公式时碰到了一个问题,那就是公式明明已经编辑好了,但是在单元格里不生效,直接把公式显示出来了,网上资料说有4种原因,但是我4种都不是,是第5种原因,如下图: 这种情况是由 ...