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