package com.tedu.day16;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射student类,获取student类的class类
*/
public class ReflectionStudent01 {
public static void main(String[] args) throws Exception {
// 获取class对象
//方式1:通过student类的对象去调用getClass方法
Class clazz1 = new Student().getClass();
// 方式二 通过类名.class
Class<Student> clazz2 = Student.class;
// 方式三通过class类中forName(类路径(包名.类名))方法
Class clazz3 = Class.forName("com.tedu.day16.Student");
System.out.println(clazz1);
System.out.println(clazz2);
System.out.println(clazz3);
//获取类的包名
System.out.println("包名为:"+clazz1.getPackage().getName());
//获取反射类的类名
System.out.println("类名为:"+clazz1.getSimpleName());
//获取反射类的全限定名(包名.类名)
System.out.println("全限定名称为:"+clazz1.getName());
System.out.println("==============================");
//获取构造方法
Constructor c1 = clazz1.getConstructor();
System.out.println(c1);
// 获取全参构造方法
Constructor[] c2 = clazz1.getConstructors();
for (Constructor con :
c2) {
System.out.println(con);
}
// 获取属性
Field name = clazz1.getDeclaredField("name");
System.out.println(name);
// 获取所有的成员变量
Field[] dec = clazz1.getDeclaredFields();
for (Field f :
dec) {
System.out.println(f);
}
System.out.println("------------------------------------------");
// 获取类的方法
Method study = clazz1.getMethod("study", String.class);
System.out.println(study);
System.out.println("所有的方法==============================");
Method[] methods = clazz1.getMethods();
for (Method me :
methods) {
System.out.println(me);
}
// 利用反射去获取到class对象(student类),并创建student对象
System.out.println("获取对象=========================");
Object o = clazz1.newInstance();
System.out.println(o);
System.out.println("创建student对象时调用全参构造");
Constructor con = clazz1.getConstructor(String.class, int.class);
// 通过带参构造去进行studnet对象创建
Object o2 = con.newInstance("蔡恒", 30);
System.out.println(o2);
//想要获取student类中的set或者get,必须向下转型
Student stu1 = (Student)o;
stu1.setAge(29);
stu1.setName("钱嘉菲");
stu1.study("java");
}
}