反射那点事儿

news/2024/5/19 4:01:04 标签: 字符串, 反射, java

单级属性赋值

java">package 阿里云大学java.java高级学习.反射练习;

import com.sun.deploy.util.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @program: Test
 * @description:
 * @author: 作者
 * @create: 2021-03-09 21:16
 */

public class 单级属性赋值 {
    public static void main(String[] args) {
        String value = "name:骚包|job:扫厕所";
        Emp emp = ClassInstanceFactory.create(Emp.class,value);
        System.out.println("姓名:" + emp.getName() + "、工作:" + emp.getJob());
    }
}

class ClassInstanceFactory {
    private ClassInstanceFactory(){}
    /**
     * 实例化对象的创建方法,该方法可以根据传入的字符串结构进行创建实例化对象:“属性:内容|属性:内容”;
     * @param clazz  要进行反射的实例化Class对象,有了Class就可以进行反射实例化对象,
     * @param value  要设置给对象的内容
     * @param <T>       泛型
     * @return      一个已经配置好的java类对象
     */
    public static <T> T create(Class<?> clazz,String value){
        try{
            Object obj = clazz.getDeclaredConstructor().newInstance();
            BeanUtils.setValue(obj,value);  //通过反射进行set的赋值操作
            return (T) obj;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

class ZmUtils {
    private ZmUtils(){}
    public static String initcap(String str){
        if(str == null || "".equals(str)){
            return null;
        }
        if(str.length() == 1) {
            return str.toUpperCase();
        }else{
            return str.substring(0,1).toUpperCase() + str.substring(1);
        }
    }
}
class BeanUtils {
    private BeanUtils(){}
    /**
     * 实现指定对象的属性设置
     * @param obj 要进行反射操作的实例化对象
     * @param value     包含我们指定内容的字符串,特殊格式
     */
    public static void setValue(Object obj , String value)  {
        String[] ans = value.split("\\|");
        for(int i=0;i<ans.length;i++){
            String[] temp = ans[i].split(":");
            try{
                Field field = obj.getClass().getDeclaredField(temp[0]);
                Method setMethod = obj.getClass().getDeclaredMethod("set" + ZmUtils.initcap(temp[0]),field.getType());
                setMethod.invoke(obj,temp[1]);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}
class Emp {
    private String name;
    private String job;

    public String getJob() {
        return job;
    }

    public String getName() {
        return name;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  • 在上面的代码里面,只适合于String类型的赋值,但是主要的还要很多其他的类型没有考虑,所以当出现了其他类型的时候,这个单级属性赋值就不太合适了,所以,这里我们要进行修改一下:
java">package 阿里云大学java.java高级学习.反射练习;

import com.sun.deploy.util.StringUtils;
import 阿里云大学java.java基础初级.Emp;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @program: Test
 * @description:
 * @author: 作者
 * @create: 2021-03-09 21:16
 */

public class 单级属性赋值 {
    public static void main(String[] args) {
        String value = "name:骚包|job:扫厕所|salary:4743.4|date:1999-12-05";
        Emp emp = ClassInstanceFactory.create(阿里云大学java.java基础初级.Emp.class,value);
        System.out.println("姓名:" + emp.getName() + "、时间:" + emp.getDate());
    }
}

class ClassInstanceFactory {
    private ClassInstanceFactory(){}
    /**
     * 实例化对象的创建方法,该方法可以根据传入的字符串结构进行创建实例化对象:“属性:内容|属性:内容”;
     * @param clazz  要进行反射的实例化Class对象,有了Class就可以进行反射实例化对象,
     * @param value  要设置给对象的内容
     * @param <T>    泛型
     * @return      一个已经配置好的java类对象
     */
    public static <T> T create(Class<?> clazz,String value){
        try{
            Object obj = clazz.getDeclaredConstructor().newInstance();
            BeanUtils.setValue(obj,value);  //通过反射进行set的赋值操作
            return (T) obj;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

class ZmUtils {
    private ZmUtils(){}
    public static String initcap(String str){
        if(str == null || "".equals(str)){
            return null;
        }
        if(str.length() == 1) {
            return str.toUpperCase();
        }else{
            return str.substring(0,1).toUpperCase() + str.substring(1);
        }
    }
}
class BeanUtils {
    private BeanUtils(){}
    /**
     * 实现指定对象的属性设置
     * @param obj 要进行反射操作的实例化对象
     * @param value     包含我们指定内容的字符串,特殊格式
     */
    public static void setValue(Object obj , String value)  {
        String[] ans = value.split("\\|");
        for(int i=0;i<ans.length;i++){
            String[] temp = ans[i].split(":");
            try{
                Field field = obj.getClass().getDeclaredField(temp[0]);
                Method setMethod = obj.getClass().getDeclaredMethod("set" + ZmUtils.initcap(temp[0]),field.getType());
                Object val = BeanUtils.getAtttributeValue(field.getType().getName(),temp[1]);
                setMethod.invoke(obj,val);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 实现属性的类型转换处理
     * @param type  属性类型,通过field获得,field.gettype().getName();
     * @param value 属性的类容,传入的时候都是字符串,需要将其变成指定的数据类型。
     * @return  返回已经转换好的属性类型的值
     */
    public static Object getAtttributeValue(String type,String value){
        if("long".equals(type) || "java.lang.Long".equals(type)){
            return Long.parseLong(value);
        }else if("double".equals(type) || "java.long.double".equals(type)){
            return Double.parseDouble(value);
        }else if("int".equals(type) || "java.long.int".equals(type)){
            return Integer.parseInt(value);
        }else if("java.util.Date".equals(type)){
            SimpleDateFormat sdf = null;
            if(value.matches("\\d{4}-\\d{2}-\\d{2}")){
                sdf = new SimpleDateFormat("yyyy-MM-dd");
            }else {
                return new Date();
            }
            try{
                return sdf.parse(value);
            } catch (ParseException e){
                return new Date();
            }
        }
        return value;
    }
}
class Emp {
    private String name;
    private String job;
    private long age;
    private  double salary;
    private Date date;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public long getAge() {
        return age;
    }

    public void setAge(long age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

  • 这里我们只是对一部分的数据类型进行了转换,还是存在很多的数据类型,如果我们是在做一个很大的项目的时候,这些所有可能存在的数据类型我们全部都要进行输入;

http://www.niftyadmin.cn/n/1329265.html

相关文章

反射与代理设计模式那点事儿

反射与代理设计模式 静态代理设计模式 我们先来看看传统的代理设计模式如果按照设计要求来讲&#xff0c;必须是基于接口的设计&#xff0c;也就是说&#xff0c;要先定义一个核心的接口类。 package 阿里云大学java.java高级学习.反射练习;class MessageReal implements IM…

JAVA笔记 ---- 网络编程

网络编程 介绍 就是多台主机之间的数据通讯操作。那么针对于网络程序的开发呢我们有两种模型。C/S 模式 即&#xff1a;客户端和服务器&#xff0c;需要两套程序&#xff0c;当服务器端进行更新的时候&#xff0c;客户端也会进行更新。**B/S模式 ** 即&#xff1a;浏览器和服…

数据库 --- 基础命令

基础命令 命令说明show databases;查看所有的数据库create database mydb1创建数据库 mydb1show create database mydb1查看数据库 mydb1 的创建信息create database mydb2 character set gbk;创建指定字符集的数据库alter database mydb2 character set utf8修改数据库的字符…

千峰JAVA学院 --- mysql数据库教程综合实验

# 综合练习 # 创建一个用户表 create table user(userid int primary key AUTO_increment,username varchar(20) not null,password varchar(18) not null,address varchar(100),phone varchar(11) );# 向用户表里面添加数据 insert into user(username,password,address,phone…

来练练排序吧,好兄弟

统计图 插入 public class Insertion {// 进行插入排序public static void sort(Comparable[] a){for(int i1;i<a.length;i){for(int ji;j>0;j--){if(greater(a[j],a[j-1])){break;} else {exch(a,j,j-1);}}}}// 比较两元素哪一个比较大public static boolean greater(C…

java输出的问题

java在多输出的时候就容易超时&#xff0c;所以我们可以使用java的流输出的&#xff0c;这样可以解决超时问题&#xff1b; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.…

算法模板

算法模板二维前缀和树状数组线段树KMP字符串匹配算法string 类API超级方便的N皇后离散化&#xff08;将一些稀疏的数据聚拢在一起&#xff09;并查集树的重心&#xff08;深度优先搜索&#xff09;树的拓扑排序朴素Dijkstra堆优化Dijkstra差分&#xff08;将一个前缀和数组差分…

C++基础图论算法大集合 (图论,看我就行了)

图论搜索技术深度优先搜索 &#xff08;应用——求重心&#xff09;广度优先搜索 &#xff08;应用——图中的层次遍历&#xff09;有向图的拓扑排序最短路问题Dijkstra算法&#xff08;朴素版&#xff09;Dijkstra算法 &#xff08;堆优化&#xff09;bellman_ford算法spfa算法…