Python动态生成Bean类,并且带toString,equals,hashcode方法

摘要:
方法名称。equals){//获取要比较的对象的字段值MethodobjGetMethod=obj.getClass().getMethod;//执行该方法以获取返回值。Compare ObjectobjProperty=objGetMethod。invoke;ObjectthisProperty=method.invoke;//如果{System.err.println(“异常信息:Class”+obj.getClass().Get Name()+“in”+methodName+“method is Null!”),则Null值报告异常;}如果{System.err.println(“异常信息:class”+this.getClass().getName()+“+methodName()”中的“method”为空!ThisProperty.equals){returnfalse;{return false}捕获{e.printStackTrace();returnfalse;}returntrue;}/***返回此对象的哈希代码值*/@OverridepublicintashCode(){//生成一个简单的位操作哈希代码Stringkey=this.toString();int prime=key.hashCode(;int hash=prime;for{hash^=^key.charAt*13131;}//返回*33;}/***返回对象的字符串表示形式*/@OverridepublicStringtoString(){//当前类的反射方法组method〔〕methodGroup=this.getClass().getMethod();//toString content StringBuffercontent=newStringBuffer(“{”);尝试{//遍历反射方法组并提取属性的getter方法{//过滤与属性StringmethodName=method.getName()无关的get方法;if(methodName.startsWith(“get”)&&!methodName.equals){StringpropName=methodName.substring.toLowerCase();content.append;content.aappend(“=”);content.eppend;content.append(“,”);}}所容纳之物append(“}”);}Catch{System.err.println(“异常信息:参数错误,无法访问对象定义,无法自反创建实例!
import com.wyz.bean.BaseVo;
import net.sf.cglib.beans.BeanGenerator;
import org.junit.Test;

import java.lang.reflect.Method;


public class MyTest1 {
    @Test
    public void test01() throws Exception {
        BeanGenerator beanGenerator = new BeanGenerator();
        beanGenerator.setSuperclass(BaseVo.class);
        beanGenerator.addProperty("value", String.class);
        BaseVo myBean = (BaseVo) beanGenerator.create();
        Method setter = myBean.getClass().getMethod("setValue", String.class);
        setter.invoke(myBean, "张三1");


        BaseVo myBean1 = (BaseVo) beanGenerator.create();
//        Method setter1 = myBean.getClass().getMethod("setValue", String.class);
//        setter1.invoke(myBean1, "张三2");
//        for (Method m :myBean.getClass().getMethods()){
//            System.out.println(m.getName());
//        }

//
//        Method toString = myBean.getClass().getMethod("toString");
//        System.out.println(toString.invoke(myBean, null));
//
//        Method getter = myBean.getClass().getMethod("getValue");
//        System.out.println(getter.invoke(myBean));
        System.out.println(myBean);
        System.out.println(myBean.equals(myBean1));
//        System.out.println(myBean.hashCode());
    }
}




package com.wyz.bean;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BaseVo{
    /**
     * 指示其他某个对象是否与此对象“相等”
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || this.getClass() != obj.getClass()) return false;
        try {
            for (Method method : this.getClass().getMethods()) {
                String methodName = method.getName();
                // 过滤Bean类字段的get方法
                if (methodName.startsWith("get") && !methodName.equals("getClass")) {
                    // 获取被比较对象的字段值
                    Method objGetMethod = obj.getClass().getMethod(methodName);
                    // 执行方法以获取返回值比较(关键点:注意参数不相同)
                    Object objProperty = objGetMethod.invoke(obj);
                    Object thisProperty = method.invoke(this);

                    // 空值报异
                    if (objProperty == null) {
                        System.err.println("异常信息:类" + obj.getClass().getName() + "中的" + methodName + "方法为null值!无法进行对象比较!");
                    }
                    if (thisProperty == null) {
                        System.err.println("异常信息:类" + this.getClass().getName() + "中的" + methodName + "方法为null值!无法进行对象比较!");
                    }
                    // 返回值不相等则返回逻辑假
                    if (!thisProperty.equals(objProperty)) {
                        return false;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 返回该对象的哈希码值
     */
    @Override
    public int hashCode() {
        // 生成简单的位运算hash散列码
        String key = this.toString();
        int prime = key.hashCode();
        int hash = prime;
        for (int i = 0; i < key.length(); i++) {
            hash ^= (hash << 23 >> 17) ^ key.charAt(i) * 13131;
        }
        // 返回结果
        return (hash % prime) * 33;
    }

    /**
     * 返回该对象的字符串表示(类似数组的toString方法输出结果)
     */
    @Override
    public String toString() {
        // 当前类反射方法组
        Method[] methodGroup = this.getClass().getMethods();
        // toString内容
        StringBuffer content = new StringBuffer("{");
        try {
            // 遍历反射方法组并提取属性的getter方法
            for (Method method : methodGroup) {
                // 过滤与属性无关的get方法
                String methodName = method.getName();
                if (methodName.startsWith("get") && !methodName.equals("getClass")) {
                    String propName = methodName.substring(3).toLowerCase();
                    content.append(propName);
                    content.append("=");
                    content.append(method.invoke(this));
                    content.append(",");
                }
            }
            content.append("}");
        } catch (IllegalAccessException ex) {
            System.err.println("异常信息:参数错误,对象定义无法访问,无法反射性地创建一个实例!
" + ex.getMessage());
        } catch (IllegalArgumentException ex) {
            System.err.println("异常信息:参数错误,向方法传递了一个不合法或不正确的参数!
" + ex.getMessage());
        } catch (InvocationTargetException ex) {
            System.err.println("异常信息:参数错误,由调用方法或构造方法所抛出异常的经过检查的异常!
" + ex.getMessage());
        }
        // 返回结果
        return content.toString();
    }
}

免责声明:文章转载自《Python动态生成Bean类,并且带toString,equals,hashcode方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL更改数据库数据存储目录死锁及oracle死锁--转载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python环境的安装

参考官方文档 http://www.runoob.com/python/python-install.html Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。 您需要下载适用于您使用平台的二进制代码,然后安装Python。 如果您平台的二进制代码是不可用的,你需要使用C编译器手动编译源代码。 编译的源代码,功能上有更多的选择性,...

conda常用命令

4.1 管理conda Conda既是包管理器,也是环境管理器。一个包管理器可以帮助你找到和安装软件包。使用几个命令,您可以设置一个完全独立的环境来运行不同版本的Python,然后继续在您的正常环境中运行您常用的Python版本。这就是像conda这样的环境管理工具的力量。 提示:无论您是使用Linux,OS X还是Windows命令提示符,在终端窗口...

Python3 tkinter基础 Listbox Scrollbar 创建垂直滚动条

         Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda : 4.5.11    typesetting : Markdown   code """ @Author : 行初心 @Date : 18...

python文件路径分隔符的详细分析

写了挺久的python,文件分隔符的掌握肯定是必须的,但是我之前写的都是不规范的文件路径分隔符,例如‘’C:User emppython.txt’,一直都没有报过错。也不知为啥,今天查阅资料才知道自己写的都是些假的python,所以就在此记录一下。 主要是需要考虑分隔符的问题:在Windows系统下的分隔符是: (反斜杠)。 在Linux系统下的分隔符是:...

python爬虫学习---爬取微软必应翻译(中英互译)

  前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者:OSinooO        本人属于python新手,刚学习的 python爬虫基础迫不及待地想试一试,看了论坛里大佬们写的在线翻译爬虫程序,想着自己把它写出来,以下是我爬微软翻译的过程,作为笔记记录下来: 1.获取信...

Python 文件读写操作-Python零基础入门教程

目录 一.Python 文件的打开 open 二.Python 文件的关闭 close 三.Python 文件的读取 read 1.read 函数 2.readline 函数 3.readlines 函数 四.Python 文件的写入 write 1.write 函数语法 2.write 函数使用案例 五.Python 文件偏移 seek...