public class Demo01 {
public static void main(String[] args) throws Exception {
//如何获取Class对象
//三张方式
// 第一种方式,直接通过类名.class
Class<?> clazz = Demo01.class;
// 第二种: 根据类的全路径名称得到Class
Class<?> clazz2 = Class.forName("com.qfedu.reflect.Demo01");
// 第三种:通过一个类的实例化对象获取该类的Class类对象
Demo01 demo =new Demo01();
Class<? extends Demo01> class3 = demo.getClass();
public class Demo02 {
public static void main(String[] args) throws Exception {
Student stu =new Student();
System.out.println(stu.phone);
stu.getAge();
//第一步:不new就可以获取一个类的实例化对象
Class<?> clazz = Student.class;
//获取类中所有的构造方法
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.getName());
}
//获取Student类中无参数的构造器,得到一个学生对象
Constructor<?> constructor = clazz.getConstructor();
Object object = constructor.newInstance();
Student stu2 = (Student) object;
System.out.println(stu2);
//通过有参数的构造器得到一个Student对象
Constructor<?> constructor2 = clazz.getConstructor(int.class,String.class,String.class);
Object object2 = constructor2.newInstance(12,"张三","181xxxx9903");
Student stu3 = (Student) object2;
System.out.println(stu3.getName());
//第二步:可以获取所有字段,包括私有字段
// 通过getFields 只能获取public字段
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
// Declared 公开的
//可以获取所有字段,包含私有的
Field[] fields2 = clazz.getDeclaredFields();
for (Field field : fields2) {
System.out.println(field.getName());
}
//第三步:可以调用类中方法,不需要new
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
//调用的是无参数的方法
Method method = clazz.getDeclaredMethod("getName");
System.out.println(method.invoke(stu3));
//如果有参数如何调用呢?
Method method2 = clazz.getDeclaredMethod("setName",String.class);
method2.invoke(stu2, "李四");
System.out.println(stu2.getName());
}
}