Java基础——反射机制
一、什么是反射机制?
当我们的程序运行中,我们可能需要动态获取程序信息以及调用的对象信息,这时候我们就需要利用到Java的反射机制。
Java的反射机制可以在程序运行的过程中构造任意一个类的对象,可以查询任意一个对象所属类,可以查询任意一个类的成员变量和方法,也可以调用任意一个对象的方法。
二、什么是Class类?
Class类和创建类时的class标签不同,它是一个特殊类,他可以存储JAVA虚拟机内存中的对象信息,并通过其他的一些类及其方法对该对象进行查询和操作。因此,Class类也是Java实现反射机制的基础。
1.创建一个Class类的三者方法
方法一:
通过Class类中的forName()方法,参数为 包.类
方法二:
先创建一个Student对象student,然后通过Student的getClass()方法将student的类直接赋予Class类。
方法三:
直接调用Student类的getClass()方法。
package FanSheJiZhi;
public class Student {
public static void main(String[] args) {
//方法一
try {
Class c = Class.forName("FanSheJiZhi.Student");
System.out.println(c.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//方法二
Student student = new Student();
Class c2 = student.getClass();
System.out.println(c2);
//方法三
Class<Student> c3 = Student.class;
System.out.println(c3.getName());
}
}
2.Class类的实例化以及反射机制的运行
创建Class类的同时,我们也获得了相关类的信息,我们也可以用Class类来实例化获取的对象信息。
首先,用Constructor类来调用类的构造方法,构造方法可以为无参构造方法也可以为带参构造方法。这里先创建一个School类来用于演示。
package FanSheJiZhi;
public class School {
private String schoolName;
private Integer year;
private Boolean tag;
public School() {
}
public School(String schoolName, Integer year, Boolean tag) {
this.schoolName = schoolName;
this.year = year;
this.tag = tag;
}
public void showInfo(){
System.out.println(this.schoolName+"成立了"+this.year+"年,"+(tag?"是重点高中":"不是重点高中"));
}
@Override
public String toString() {
return "School{" +
"schoolName='" + schoolName + '\'' +
", year=" + year +
", tag=" + tag +
'}';
}
public String getSchoolName() {
return schoolName;
}
public void setSchoolName(String schoolName) {
this.schoolName = schoolName;
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
public Boolean getTag() {
return tag;
}
public void setTag(Boolean tag) {
this.tag = tag;
}
}
接下来,我们创建一个测试类,来演示。
package FanSheJiZhi;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class SchoolTest {
public static void main(String[] args) {
try {
Class c = Class.forName("FanSheJiZhi.School");
//用Construtor类来创建 构造方法 的对象,即将构造方法实例化
//无参构造方法的对象
Constructor constructor = c.getConstructor();
//有参构造方法的对象
Constructor constructor = c.getConstructor(new Class[]{String.class, Integer.class, Boolean.class});
//将对象实例化
Object obj = constructor.newInstance(new Object[]{});
Object obj2 = constructor.newInstance(new Object[]{"清华白鸟", 114, true});
//obj为无参构造方法,输出null
System.out.println(obj);
//通过Method类来获取Shool类中名为“shouwInfo”的方法
Method showMsg = c.getMethod("showInfo");
//用Method类来调用方法,showInfo()方法为无参方法,所以后面参数为null
showMsg.invoke(obj,null);
showMsg.invoke(obj2,null);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
12万+

被折叠的 条评论
为什么被折叠?



