栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2021-09-29 反射习题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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,利用反射在运行期输入要加载的类名,然后实例化对象,然后执行该私有方法。

创建类:

class Demo {
    private void demo() {
        System.out.println("这是一个私有方法demo!");
    }
}

在测试类中:

        Class cl = Class.forName("TXT.CodeTest.Demo");
        Object con = cl.newInstance();
        Method m = cl.getDeclaredMethod("demo");
        m.setAccessible(true);
        m.invoke(con);

执行结构:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/275085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号