反射的应用

反射的应用,读取properties配置文件的属性和值,通过反射创建对象

stu.properties,存储在项目的src文件夹下,内容如下:

class=com.itheima.reflect.Student

name=jack gender= age=18

Student实体类public class Student {

    private String name;

    private String gender;

    private int age;



    public Student() {

    }



    public Student(String nameString gender, int age) {

        this.name = name;

        this.gender = gender;

        this.age = age;

    }



    public String getName() {

        return name;

    }



    public void setName(String name) {

        this.name = name;

    }



    public String getGender() {

        return gender;

    }



    public void setGender(String gender) {

        this.gender = gender;

    }



    public int getAge() {

        return age;

    }



    public void setAge(int age) {

        this.age = age;

    }



    @Override

    public String toString() {

        return "Student{" +

                "name='" name '/'+

                ", gender='" gender '/'+

                ", age=" age +

                '}';

    }

}

测试类根据配置文件信息创建一个学生对象。import java.io.FileInputStream;

import java.io.InputStreamReader;

import java.lang.reflect.Field;

import java.util.Properties;

import java.util.Set;



public class Demo06 {

    public static void main(String[] args) {

        // 获取对象

        Student stu = (Student) createObject();

        // 输出对象

        System.out.println(stu);

    }



    public static Object createObject(){

        try {

            // 创建属性集合

            Properties p = new Properties();

            // 从文件中加载内容到集合中,编码与idea一致避免乱码

            p.load(new InputStreamReader(new FileInputStream("stu.properties"),"utf-8"));//src 路径下

            // 从集合中获得类名

            String className = p.getProperty("class");

            // 通过反射获得Class对象

            Class cla = Class.forName(className);

            // 快速创建对象

            Object obj = cla.newInstance();

            Set<String> names = p.stringPropertyNames();//获取所有属性

            // 遍历集合

            for (String name : names) {

                // 判断name是否class

                if(name.equals("class")){

                    continue;

                }

                // 获得值

                String value = p.getProperty(name);

                // 根据成员变量名获得对应的Field对象

                Field f = cla.getDeclaredField(name);

                // 暴力反射

                f.setAccessible(true);

                // 获得成员变量的类型

                Class<?> type = f.getType();

                if(type==int.class){// 判断成员变量的数据类型是否是int类型

                    f.setInt(objInteger.parseInt(value));

                }else{

                    // f对象的赋值

                    f.set(obj,value);

                }



            }

            // 返回对象

            return obj;

        catch (Exception e) {

            e.printStackTrace();

        }

        return null;

    }

}

执行main方法后控制台将输出

Student{name='jack', gender='男', age=18}

http://java.itcast.cn

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253302.html

(0)
上一篇 2022年5月8日
下一篇 2022年5月8日

相关推荐

发表回复

登录后才能评论