Java实验十三

本文详细介绍了如何使用Java反射机制来获取类的结构,包括实现的接口、父类、构造方法、方法和属性。提供了具体的代码示例,如获取Person类的全部接口、父类、构造方法、方法和属性的修饰符等。此外,还展示了如何不使用`new`关键字,通过反射创建并操作Student类对象,将其信息保存到文件中。
摘要由CSDN通过智能技术生成

第一题

定义一个 Person 类(实现了接口 China,Person 类定义了一个参数的构造方法,两个参数的构造方法以及 setter 和 getter 方法),通过反射机制取得类的结构。
(1)取得 Person 类所实现的全部接口;
(2)取得父类;
(3)取得全部构造方法,并使用 Modifier 还原修饰符;
(4)取得全部方法,并使用 Modifier 还原修饰符;
(5)取得全部属性,并使用 Modifier 还原修饰符。

参考:https://blog.csdn.net/yuan465887375/article/details/8806045
《Java开发实战经典》

接口及Person类
interface China {    // 定义China接口
    public static final String NATIONAL = "China";
    public static final String AUTHOR = "Star";

    public void sayChina();

    public String sayHello(String name, int age);
}

public class Person implements China {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this(name);
        this.age = age;
    }

    public void sayChina() {
        System.out.println("作者:" + AUTHOR + ",国籍:" + NATIONAL);
    }

    public String sayHello(String name, int age) {
        return name + ",你好!我今年:" + age + "岁了!";
    }

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

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

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }
};
取得 Person 类所实现的全部接口
public class GetInterfaceDemo {
    public static void main(String args[]) {
        Class<?> c1 = null;
        try {
            c1 = Class.forName("Person");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Class<?> c[] = c1.getInterfaces();    // 以数组形式返回实现的全部接口
        for (int i = 0; i < c.length; i++) {
            System.out.println("实现的接口名称:" + c[i].getName());    // 输出接口名称
        }
    }
};

在这里插入图片描述

取得父类
public class GetSuperClassDemo {
    public static void main(String args[]) {
        Class<?> c1 = null;  // 声明Class对象
        try {
            c1 = Class.forName("Person"); // 实例化对象
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Class<?> c2 = c1.getSuperclass(); // 取得父类
        System.out.println("父类名称:" + c2.getName());
    }
};

在这里插入图片描述

取得全部构造方法,并使用 Modifier 还原修饰符
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

public class GetConstructorDemo03 {
    public static void main(String args[]) {
        Class<?> c1 = null;        // 声明Class对象
        try {
            c1 = Class.forName("Person");    // 实例化对象
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Constructor<?> con[] = c1.getConstructors();    // 取得一个类中的全部构造
        for (int i = 0; i < con.length; i++) {
            Class<?> p[] = con[i].getParameterTypes();        // 得到构造方法中的全部参数
            System.out.print("构造方法:");     // 输出构造,直接打印
            int mo = con[i].getModifiers(); // 得到所要的访问权限
            System.out.print(Modifier.toString(mo) + " ");    // 得到修饰符
            System.out.print(con[i].getName());    // 取得构造方法的名字
            System.out.print("(");
            for (int j = 0; j < p.length; j++) {
                System.out.print(p[j].getName() + " arg" + i);
                if (j < p.length - 1) {
                    // 判断此是否是最后一个参数
                    System.out.print(",");    // 输出“,”
                }
            }
            System.out.println("){}");
        }
    }
};

在这里插入图片描述

取得全部方法,并使用 Modifier 还原修饰符
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class GetMethodDemo {
    public static void main(String args[]) {
        Class<?> c1 = null;        // 声明Class对象
        try {
            c1 = Class.forName("Person");    // 实例化对象
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Method m[] = c1.getMethods();    // 取得全部方法
        for (int i = 0; i < m.length; i++) {
            Class<?> r = m[i].getReturnType();    // 得到返回值类型
            Class<?> p[] = m[i].getParameterTypes();    // 取得全部参数的类型
            int xx = m[i].getModifiers();    // 得到修饰符
            System.out.print(Modifier.toString(xx) + " ");    // 输出修饰符
            System.out.print(r + " ");
            System.out.print(m[i].getName());
            System.out.print("(");
            for (int j = 0; j < p.length; j++) {
                System.out.print(p[j].getName() + " " + "arg" + j);
                if (j < p.length - 1) {
                    System.out.print(",");
                }
            }
            Class<?> ex[] = m[i].getExceptionTypes();    // 取出异常
            if (ex.length > 0) {
                System.out.print(") throws ");
            } else {
                System.out.print(")");
            }
            for (int j = 0; j < ex.length; j++) {
                System.out.print(ex[j].getName());
                if (j < p.length - 1) {
                    System.out.print(",");
                }
            }
            System.out.println();
        }
    }
};

在这里插入图片描述

取得全部属性,并使用 Modifier 还原修饰符
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class GetFieldDemo {
    public static void main(String args[]) {
        Class<?> c1 = null;  // 声明Class对象
        try {
            c1 = Class.forName("Person"); // 实例化对象
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        { // 本类属性
            Field f[] = c1.getDeclaredFields(); // 取得本类中的属性
            for (int i = 0; i < f.length; i++) {
                Class<?> r = f[i].getType(); // 得到属性类型
                int mo = f[i].getModifiers(); // 得到修饰符的数字
                String priv = Modifier.toString(mo); // 还原修饰符
                System.out.print("本类属性:");
                System.out.print(priv + " ");
                System.out.print(r.getName() + " "); // 得到属性类型
                System.out.print(f[i].getName()); // 输出属性名称
                System.out.println(" ;");
            }
        }
        { // 公共属性
            Field f[] = c1.getFields(); // 取得本类中的公共属性
            for (int i = 0; i < f.length; i++) {
                Class<?> r = f[i].getType(); // 得到属性类型
                int mo = f[i].getModifiers(); // 得到修饰符的数字
                String priv = Modifier.toString(mo); // 还原修饰符
                System.out.print("公共属性:");
                System.out.print(priv + " ");
                System.out.print(r.getName() + " "); // 得到属性类型
                System.out.print(f[i].getName()); // 输出属性名称
                System.out.println(" ;");
            }
        }
    }
};
 

在这里插入图片描述

第二题

定义一个学生类,其中包括姓名、年龄、成绩的属性,之后通过键盘输入学生的内容,并将内容保存在文件中,所有的操作要求全部使用反射机制完成,即不能使用通过关键字 new 创建学生类对象的操作。

Student类
public class Student {
    private String name;
    private int age;
    private double score;

    public Student(String name, int age, double score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public String toString() {
        return "name:" + name + " age:" + age + " score:" + score;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}
测试类:
import java.io.PrintStream;
import java.lang.reflect.Constructor;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        PrintStream file = new PrintStream("Student.txt");  //创建文件
        System.out.println("输入学生姓名:");
        String name = sc.nextLine();
        System.out.println("输入学生年龄:");
        int age = sc.nextInt();
        System.out.println("输入学生成绩:");
        double score = sc.nextDouble();
        Class<?> c = null;
        try {
            c = Class.forName("Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Student per = null;
        Constructor<?> cons[] = null;
        cons = c.getConstructors();
        try {
            per = (Student) cons[0].newInstance(name, age, score);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(per);
        file.println(per.toString());  //写入文件
    }
}

在这里插入图片描述
student.txt文件内容:
在这里插入图片描述

实验5 常用类(2学时) 一、实验目的 1. 熟悉Java中的String、StringBuffer、Math、包装器类的使用方法。 2. 使用常用类解决一般性的应用问题。 3. 掌握JavaSE API文档的使用方法。 二、实验内容 1. 编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母数。(字符串可以在main方法中指定) 2. 调用java.lang.Math的成员函数“public static double random()”运算下面表达式1000次,(int) (Math.random()*20+0.5),统计其中生成的整数0、1、2、……、20的个数分别是多少,并输出统计结果。 3. 编写一个方法,返回一个double型的二维数组,数组中的元素通过解析字符串参数获得。例如,字符串参数:“1,2;3,4,5;6,7,8”,对应的数组为: d[0,0] = 1.0 d[0,1] = 2.0 d[1,0] = 3.0 d[1,1] = 4.0 d[1,2] = 5.0 d[2,0] = 6.0 d[2,1] = 7.0 d[2,2] = 8.0 三、实验要求 完成程序设计并提交实验报告。 实验6 容器(2学时) 一、实验目的 1. 熟悉容器类库中常用类的使用方法。 2. 使用常用容器类解决一般性的应用问题。 二、实验内容 1. 用HashMap模拟一个网上购物车。要求:从键盘输入5本书的名称、单价、购买数量,将这些信息存入一个HashMap,然后将该HashMap作为参数调用方法getSum(HashMap books),该方法用于计算书的总价并返回。【说明:键盘输入可以使用Scanner类】 2. 使用两个Stack类(JDK容器类库中的Stack类)实现一个队列类MyQueue,提供队列的入队列和出队列操作:enQueue和deQueue。 3. 写一个彩票程序:30选7。随机(1~30之间)生成7个随机数,注意不能重复。然后从键盘输入7个数,对比7个数是否与随机数有相同的。最后显示“中了几个号”。同时,如果中了7个号,显示一等奖;如果中了6个号,显示二等奖;如果中了5个号,显示三等奖。要求:首先写出程序的实现思想,特别是程序所使用的数据结构,然后写出Java实现代码。【说明:键盘输入可以使用Scanner类】 三、实验要求 完成程序设计并提交实验报告。 实验7 流(2学时) 一、实验目的 1. 熟悉流类库中各种常用流的使用方法。 2. 能够使用流类实现基本的文件读写。 二、实验内容 1. 编写程序,在控制台窗口提示输入两个整数,然后接收这两个整数,并输出它们的和。(要求:键盘输入通过流封装System.in获取,不要使用Scanner类) 2. 设计学生类Student,属性:编号(整型);姓名(字符串),成绩(整型)。编写一个程序:要求:(1)输入5个学生的姓名和成绩,将其姓名和成绩保存到data.txt中;(2)然后从该文件中读取数据,求得这五个学生的平均成绩。 三、实验要求 完成程序设计并提交实验报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Re:从零开始的代码生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值