20220527_Java_反射的用途两种

本文介绍如何使用Java反射机制实现给泛型集合添加不同类型的元素及创建一个通用框架来存储多种类型的对象,如学生和教师信息。

文章目录


一.给集合添加泛型以外的数据

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class reflectUseDemo1 {
    public static void main(String[] args) throws Exception {
        //反射的作用一,给指定了泛型的集合加入其他类型的数据
        List<String> li = new ArrayList<>();
        List<Integer> li1 = new ArrayList<>();
        //编译时,两个集合类型不同,但编译后,运行时,都是java.util.ArrayList类型
        System.out.println(li.getClass());
        System.out.println(li1.getClass());
        //所以在运行阶段使用的反射,可以给编译时泛型确定的集合加入异类型
        System.out.println(li.getClass() == li1.getClass());
        System.out.println("=======divide line========");
        li1.add(11);
        li1.add(22);
//        li1.add("HelloJava");不能这样添加
        Class c = li1.getClass();
        Method add = c.getDeclaredMethod("add",Object.class);
        /**
         * 输出集合的add方法的信息如下
         * System.out.println('['+add.getName()+"]'return value is ["+add.getReturnType()+
         *                 "], it has paras "+add.getParameterCount());
         * [add]'return value is [boolean], it has paras 1
         */
        boolean bl = (boolean)add.invoke(li1,"HelloJava");
        System.out.println(bl);
        System.out.println(li1);



    }
}

文章目录


二.用反射创建通用框架
学生类

public class Student {
    private String name;
    private String gender;
    private int age;
    private int classNum;
    private String hobby;

    public Student() {
    }

    public Student(String name, String gender, int age, int classNum, String hobby) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.classNum = classNum;
        this.hobby = hobby;
    }

    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;
    }

    public int getClassNum() {
        return classNum;
    }

    public void setClassNum(int classNum) {
        this.classNum = classNum;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

}

老师类

public class Teacher {
    private String name;
    private String gender;
    private int age;
    private boolean marry;

    public Teacher() {
    }

    public Teacher(String name, String gender, int age, boolean marry) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.marry = marry;
    }

    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;
    }

    public boolean isMarry() {
        return marry;
    }

    public void setMarry(boolean marry) {
        this.marry = marry;
    }
}

用于存储不同类对象,比如上面的老师和学生信息的框架

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;

public class MyBatisUtil {
    /**
     * 用这个框架保存任意对象的信息
     */
    public static void saveInfo(Object ob){
        try (
                PrintStream ps = new PrintStream(new FileOutputStream
                        ("junit_reflect_annotation_proxy\\src\\reflect_usage_data.txt",true))
                ) {
            Class c = ob.getClass();
            /**getSimpleName是获取当前类名,getName是获取全限名,包名+类名*/
            ps.println("====="+c.getSimpleName()+"=====");

            Field[] fi = c.getDeclaredFields();
            for (Field field : fi) {
                String name = field.getName();

                field.setAccessible(true);
                String value = field.get(ob) + "";

                ps.println(name+"===>"+value+"\r\n");
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

最后执行体

public class reflectUseDemo2 {
    /**
     * 在不清楚对象具体信息的前提下,用反射做通用框架
     */
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("leon");
        s.setGender("male");
        s.setAge(29);
        s.setClassNum(3);
        s.setHobby("reading");
        MyBatisUtil.saveInfo(s);//那是一个静态方法,类名直接调用,太好了

        Teacher t = new Teacher();
        t.setName("ashely");
        t.setGender("female");
        t.setAge(20);
        t.setMarry(false);
        MyBatisUtil.saveInfo(t);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值