`
kong0itey
  • 浏览: 302366 次
社区版块
存档分类
最新评论

一个给pojo生成hashcode、equals、toString等方法的工具类

    博客分类:
  • java
阅读更多
一个给pojo生成hashcode、equals、toString等方法的工具类
package com.kong.coder;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class CodeFactory {

	public static void main(String[] args) {
		String projectPath = "D:\\Workspaces\\MyEclipse 10\\lowcaActivity";
		String packageName = "com.lowca.activity.pojo";
		String[] banedClassNames = {};
		appendCompareMethods(projectPath, packageName, banedClassNames);
	}

	public static void appendCompareMethods(String projectPath,
			String packageName, final String[] banedClassNames) {
		String packagePath = File.separator
				+ packageName.replace(".", File.separator);
		File packageFile = new File(projectPath + File.separator + "src"
				+ packagePath);
		if (!packageFile.exists() || !packageFile.isDirectory()) {
			System.err.println("包文件不存在");
			System.exit(-1);
		}
		File[] pojoFiles = packageFile.listFiles(new FilenameFilter() {

			@Override
			public boolean accept(File dir, String name) {
				boolean isBaned = false;
				for (String banedClassName : banedClassNames) {
					if (name.equals(banedClassName + ".java")) {
						isBaned = true;
						break;
					}
				}
				return !isBaned && name.endsWith(".java");
			}
		});
		if (pojoFiles == null || pojoFiles.length == 0) {
			System.err.println("包文件是空的,找不到pojo");
			System.exit(-1);
		}
		for (File pojoFile : pojoFiles) {
			handlePojoFile(packageName, pojoFile);
		}
	}

	private static void handlePojoFile(String packageName, File pojoFile) {
		String pojoFileName = pojoFile.getName();
		String pojoClassName = packageName + "."
				+ pojoFileName.substring(0, pojoFileName.length() - 5);
		Class<?> pojoClass = null;
		try {
			pojoClass = Class.forName(pojoClassName);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		Method[] methods = pojoClass.getMethods();
		List<Method> getterList = new ArrayList<Method>();
		// 遍历反射方法组并提取当前类属性的getter方法
		for (Method method : methods) {
			// 过滤与当前类属性无关的get方法
			if (method.getName().startsWith("get")
					&& !method.getName().equals("getClass")) {
				getterList.add(method);
			}
		}
		MethodnameFilter methodnameFilter = new MethodnameFilter() {

			@Override
			public boolean accept(String name) {
				return name.matches("get([A-Z][a-zA-Z])*Id") ? false : true;
			}
		};
		String hashCodeCode = getHashCodeCode(pojoClass, getterList,
				methodnameFilter);
		String equalsCode = getEqualsCode(pojoClass, getterList,
				methodnameFilter);
		String toStringCode = getToStringCode(pojoClass, getterList,
				methodnameFilter);
		String methodsCode = hashCodeCode + equalsCode + toStringCode;

		writeCodeToPojoFile(methodsCode, pojoFile);
	}

	private static void writeCodeToPojoFile(String methodsCode, File pojoFile) {
		BufferedReader br = null;
		BufferedWriter bw = null;
		try {
			FileReader fr = new FileReader(pojoFile);
			br = new BufferedReader(fr);
			String line;
			StringBuffer sb = new StringBuffer();
			while ((line = br.readLine()) != null) {
				sb.append(line + "\r\n");
			}
			int pos = sb.lastIndexOf("}");
			sb.insert(pos, methodsCode);

			FileWriter fw = new FileWriter(pojoFile);
			bw = new BufferedWriter(fw);
			bw.write(sb.toString());
			bw.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (br != null)
					br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}

			try {
				if (bw != null)
					bw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private static String getEqualsCode(Class<?> pojoClass,
			List<Method> getterList, MethodnameFilter methodnameFilter) {
		StringBuffer sb = new StringBuffer();
		sb.append("\n\tpublic boolean equals(Object object) {\n");
		sb.append("\t\tif (this == object)\n");
		sb.append("\t\t\treturn true;\n");
		sb.append("\t\tif (!(object instanceof ${class}))\n");
		sb.append("\t\t\treturn false;\n");
		sb.append("\t\tfinal ${class} ${classLowercaseFirst} = (${class}) object;\n");
		for (Method getter : getterList) {
			String getterName = getter.getName();
			if (methodnameFilter != null
					&& !methodnameFilter.accept(getterName))
				continue;
			sb.append("\t\tif (!" + getterName
					+ "().equals(${classLowercaseFirst}." + getterName
					+ "()))\n");
			sb.append("\t\t\treturn false;\n");
		}
		sb.append("\t\treturn true;\n");
		sb.append("\t}\n");
		String code = sb.toString();
		String className = pojoClass.getSimpleName();
		String classNameLowercaseFirst = toLowercaseFirst(className);
		code = code.replaceAll("\\$\\{class\\}", className);
		code = code.replaceAll("\\$\\{classLowercaseFirst\\}",
				classNameLowercaseFirst);
		return code;

	}

	private static String getHashCodeCode(Class<?> pojoClass,
			List<Method> getterList, MethodnameFilter methodnameFilter) {
		StringBuffer sb = new StringBuffer();
		sb.append("\n\tpublic int hashCode() {\n");
		sb.append("\t\tint result;\n");
		boolean first = true;
		for (Method getter : getterList) {
			String getterName = getter.getName();
			if (methodnameFilter != null
					&& !methodnameFilter.accept(getterName))
				continue;
			if (first) {
				first = false;
				sb.append("\t\tresult = " + getterName + "().hashCode();\n");
			} else {
				sb.append("\t\tresult = 29 * result + " + getterName
						+ "().hashCode();\n");
			}
		}
		sb.append("\t\treturn result;\n");
		sb.append("\t}\n");
		String code = sb.toString();
		return code;

	}

	private static String getToStringCode(Class<?> pojoClass,
			List<Method> getterList, MethodnameFilter methodnameFilter) {
		StringBuffer sb = new StringBuffer();
		sb.append("\n\tpublic String toString() {\n");
		boolean first = true;
		for (Method getter : getterList) {
			String getterName = getter.getName();
			if (methodnameFilter != null
					&& !methodnameFilter.accept(getterName))
				continue;
			String filedName = toLowercaseFirst(getterName.substring(3));
			if (first) {
				first = false;
				sb.append("\t\treturn \"${class} [" + filedName + "=\" + "
						+ filedName + "\n");
			} else {
				sb.append("\t\t+ \", " + filedName + "=\" + " + filedName
						+ "\n");
			}
		}
		sb.append("\t\t + \"]\";\n");
		sb.append("\t}\n");
		String code = sb.toString();
		String className = pojoClass.getSimpleName();
		code = code.replaceAll("\\$\\{class\\}", className);
		return code;

	}

	private static String toLowercaseFirst(String pojoClassName) {
		return pojoClassName.substring(0, 1).toLowerCase()
				+ pojoClassName.substring(1);
	}

	interface MethodnameFilter {
		boolean accept(String name);
	}
}
分享到:
评论

相关推荐

    实体类POJO生成器

    它的工作原理是通过解析数据库中的表结构,自动生成对应的Java类,包括属性(字段)、getter和setter方法、构造函数以及toString()、equals()和hashCode()等常用方法。 在使用POJO生成器时,开发者通常需要先连接到...

    Mybatis生成pojo插件

    - 支持生成ToString、Equals和HashCode方法,便于调试和比较对象。 - 能够生成带有注释的代码,帮助理解字段含义。 - 可能有集成其他Mybatis相关的功能,如Mapper XML文件的生成。 总的来说,Mybatis pojo插件是...

    基于Druid的SqlParser模块解析create table语句创建java POJO和DAO类的效率工具.zip

    4. 可能还包括构造函数、toString()、equals()和hashCode()等常用方法。 生成DAO类的过程中,会包含以下内容: 1. 定义接口,接口中的方法对应于基本的CRUD(Create、Read、Update、Delete)操作,如insert()、...

    Oracle 自动生成POVO工具

    此外,工具还可能支持生成一些额外的功能,比如toString()、equals()和hashCode()方法,以便于调试和比较对象。 使用自动化生成的POJO和VO类有以下优势: 1. 提高开发效率:避免了手动编写大量的Java类。 2. 减少...

    lombok-plugin-0.28-2018.1_lombok2018.1_lombook_lombok0.29下载_fire

    Lombok是一款非常受欢迎的Java开发工具,它通过注解处理器自动为Java类生成构造函数、getter、setter、equals、hashCode、toString等常用方法,极大地减少了Java程序员编写样板代码的工作量。"lombok-plugin-0.28-...

    最新 lombok 1.18.4.jar

    1. `@Data` 注解:这是一个综合注解,可以为类生成所有基本的 getter 和 setter,同时提供 equals、hashCode 和 toString 方法。这对于创建数据传输对象(DTO)或简单的 POJO 类非常有用。 2. `@AllArgsConstructor...

    lombok-1.18.12.zip

    Lombok 是一个强大的 Java 开发工具,其主要目标是简化 Java 代码,特别是那些普通的 Java POJO(Plain Old Java Object)类。通过提供一系列的注解,Lombok 可以自动处理诸如 getter、setter、equals、hashCode 和 ...

    mybatis逆向工程自动生成javabean

    每个类通常包含字段(对应数据库的列)、getter和setter方法,以及equals()、hashCode()和toString()等常用方法。同时,还会生成对应的Mapper接口和XML配置文件,方便后续编写SQL查询和操作。 逆向工程完成后,...

    lombok 1.18.24

    在 Java 开发中,Lombok 提供的注解可以极大地简化类的构建,特别是对于那些包含大量 getter、setter、equals、hashCode 和 toString 方法的数据传输对象(DTO)。 1. **注解介绍** - `@Data`: 这个注解会自动生成...

    lombok.jar

    当你在类上添加这个注解,Lombok会为所有的非静态字段自动生成getter和setter方法,同时还会提供一个默认的toString()、equals()和hashCode()方法。 2. `@Getter` 和 `@Setter`:这两个注解分别用于生成getter和...

    mybatis逆向工程

    例如,你可以决定字段的命名策略、是否生成equals()和hashCode()方法、是否生成ToString方法,甚至可以调整SQL语句的生成方式等。 在使用generatorSqlmapCustom之前,你需要配置MyBatis的generatorConfig.xml文件,...

    generatorSqlmapCustom-master.zip

    如果你需要添加其他功能,如ToString、Equals或HashCode方法,可以在配置文件中进行设定。 Mapper接口则定义了与数据库交互的操作,如查询、插入、更新和删除。逆向工程会为每个表生成相应的Mapper接口,方法名通常...

    关于Lombok插件的使用.docx

    - 如果类间存在继承关系,`@Data`生成的`equals()`方法只会比较当前类中的属性,这可能导致逻辑错误。 - 解决方案:避免使用`@Data`注解在具有继承结构的类上;如果需要,可以显式地重写`equals()`方法,并使用`@...

    HibernateTools 工具

    这个工具集包括了多种功能,如配置文件生成、映射文件生成以及POJO(Plain Old Java Object)类的自动生成等,极大地提升了开发效率。 1. **配置文件生成** HibernateTools提供了从数据库反向工程生成Hibernate...

    Lombok笔记文档_*************************

    在传统的Java开发中,我们经常需要为POJO类编写大量的getter、setter、equals()、hashCode()、toString()等方法,这些代码虽然在实际功能上并不复杂,但增加了代码的体积,降低了代码的可读性。Lombok的目标是通过...

    generator, A code generator for MyBatis and iBATIS..zip

    同时,还可以选择是否生成equals()、hashCode()和toString()方法,以便于对象的比较和调试。 对于Mapper接口,MBG会根据数据库表结构自动生成CRUD操作的方法。这些方法对应于SQL查询,如selectByPrimaryKey、insert...

    MyVo Generate POJOs.groovy.zip

    - 最后,可能还会生成构造函数和其他辅助方法,比如toString(),hashCode()和equals()。 4. **优化与扩展**: 这些脚本可以进一步优化,例如添加注解支持(如`@Entity`,`@Table`等),以便于集成ORM框架如...

    lombok-plugin-0.15.17- IntelliJ IDEA 2017.2.6 x64

    Lombok 是一个 Java 开发工具库,它通过提供一系列注解来简化代码,尤其是在创建 POJO(Plain Old Java Object)类时。Lombok 的主要目标是减少样板代码,提高开发效率,让代码更加简洁易读。`lombok-plugin-0.15.17...

    Lombok使用讲解及原理1

    此外,`@Data` 注解则一次性生成这些方法,以及 `@ToString` 和 `@EqualsAndHashCode`,适用于创建基本的 POJO 类。 `@ToString` 自动覆盖 `toString()` 方法,可以排除某些字段或包含父类信息。`@...

    lombok-plugin-0.29-2019.2.zip

    Lombok 是一个 Java 开发工具库,它通过提供一系列注解来简化代码,尤其是在创建 Java POJO(Plain Old Java Object)类时。Lombok 的主要目标是减少样板代码,提高开发效率,使得开发者可以专注于业务逻辑而不是...

Global site tag (gtag.js) - Google Analytics