其他分享
首页 > 其他分享> > 2021-09-29 反射习题

2021-09-29 反射习题

作者:互联网

编程题
1. 定义封装类Student,类中的成员有:  
    私有属性:学号,姓名,年龄,性别
    无参构造方法,全参数构造方法
    定义每个属性的setters和getters方法
    重写toString方法和equals方法(根据学号比较对象)

   在测试类中利用反射完成以下操作:
    1. 用户从控制台输入要加载的类名
    2. 实例化该类,要求调用有参构造方法完成实例化对象的同时为属性赋值
    3. 获取并遍历类中的所有方法,执行所有的get开头的方法,并将其返回值打印输出。

封装类:

class Student {
    //1、四个私有属性:学号、姓名、年龄、性别
    private int sid;
    private String sname;
    private int sage;
    private String ssex;
    //2、两个构造方法:无参和全参
    public Student() {
    }
    public Student(int sid, String sname, int sage, String ssex) {
        this.sid = sid;
        this.sname = sname;
        this.sage = sage;
        this.ssex = ssex;
    }
    //重写toString():
    @Override
    public String toString() {
        return "Student{" +"sid=" + sid + ", sname='" + sname + '\''
                +", sage=" + sage + ", ssex='" + ssex + '\'' +'}';
    }
    //重写equals和hashCode
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return sid == student.sid;
    }
    @Override
    public int hashCode() {
        return Objects.hash(sid);
    }
    //get和set:

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public int getSage() {
        return sage;
    }

    public void setSage(int sage) {
        this.sage = sage;
    }

    public String getSsex() {
        return ssex;
    }

    public void setSsex(String ssex) {
        this.ssex = ssex;
    }
}

测试方法:在main中

        Scanner sc = new Scanner(System.in);
        System.out.print("请输入您要操作的类名:");
        String name = sc.next();
        Class cls = Class.forName("TXT.CodeTest."+name);
        System.out.println("您要操作的类是:"+cls.getName());
        Constructor c = cls.getConstructor(int.class,String.class,int.class,String.class);
        {//用于测试的,非答题代码:
            Object stu1 = c.newInstance(819, "抱羊", 20, "女");
            Object stu2 = c.newInstance(819, "卷卷", 20, "女");
            //试一下equals方法写没写好:
            System.out.println(stu1.equals(stu2));//true,写的很棒!
            //试一下toString方法写没写好:
            System.out.println(stu1.toString());
            //Student{sid=819, sname='抱羊', sage=20, ssex='女'},写得很成功!
        }
        Student stu = (Student) c.newInstance(927,"小羊",19,"男");
        Method methods[] = cls.getMethods();//获得这个类所有的方法
        for (Method m:methods) {//遍历方法的集合
            if(m.getName().contains("get")){//如果方法名包含get
                Object o = cls.getMethod(""+m.getName()).invoke(stu);
                //getMethod能获得这个方法,参数名为方法名getName,invoke调用,返回值类型为Object接收
                //上面这段话其实等价于Object o = m.invoke(stu);
                System.out.println(m.getName()+"方法获得的值为:"+o);
            }
        }

运行结果:

 

2.创建Demo类,在类中定义一个私有方法  demo(),方法体中输出“私有方法”,
创建测试类Test,利用反射在运行期输入要加载的类名,然后实例化对象,然后执行该私有方法。

标签:sname,String,int,09,sage,2021,sid,习题,public
来源: https://blog.csdn.net/zz2097831284/article/details/120555306