自动生成构造方法、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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值