java之反射2
1.前面我们知道了什么是反射以及反射的创建方式,现在我们来对反射做一点补充
//先建一个学生类作为我们的实验类
//制作一个javabean
//(javabean是一种基本的结构,私有的属性,公有地get/set方法,一个无参的构造方法,以及类的属性是共有的)
public class Student {
private int stuno;
private String sname;
private String schoolName;
public Student() {
}
public Student(int stuno, String sname, String schoolName) {
this.stuno = stuno;
this.sname = sname;
this.schoolName = schoolName;
}
public int getStuno() {
return stuno;
}
public void setStuno(int stuno) {
this.stuno = stuno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
}
//在测试类中测试
//创建完成了,不创建对象,直接使用类名来创建类
Class c=Class.forName("包名.类名");
//得到了类对象
Field []field=c.getDeclareFields();
//使用加强for来看有哪些属性
for(Field f:field){
System.out.println(f);
}
//单独调出一个属性
Field f=c.getDeclareField();
//因为属性是私有的,所以无法调用,这时就要使用setAccessible()了,它可以改变属性的访问权限
f.setAccessible(true);
//这时就可以调用了,怎么调用呢?使用invoke()函数调用
f.invoke();
//普通方法的调用也是类似
Method method =c.getDeclareMethod("方法名");
//私有方法想要调用就用setAccessible(true);
//调用就用invoke(实例对象,参数类型.class...);
2.反射的作用
和泛型的结合使用
反射是在运行时起作用的,而泛型是在编译时起作用的(运行的时候压根就没有泛型这东西,就是为了限制程序员别啥都往里面放),这样就有意思了,我们可以使用反射往泛型里放不该有的东西,而欺骗了编译系统,23333