一、 Source 源代码阶段java
二、 Class 类对象阶段dom
三、 runtime 运行时阶段ide
一、 Class.forName("全类名");3d
二、 类名.class;code
三、 对象.getClass();对象
多用于对象获取字节码blog
同一个字节码文件(*.class)在一次程序运行过程当中,只会被加载一次。内存
package top.uaoie.day03; import top.uaoie.domain.Person; public class ReflectDome01 { public static void main(String[] args) throws Exception { //1. Class.forName("全类名"); Class clazz1 = Class.forName("top.uaoie.domain.Person"); //2. 类名.class; Class clazz2 = Person.class; //3. 对象.getClass(); Person p = new Person(); Class clazz3 = p.getClass(); System.out.println(clazz1); System.out.println(clazz2); System.out.println(clazz3); //比较三个对象 System.out.println(clazz1 == clazz2); System.out.println(clazz1 == clazz3); } }
一、 获取全部的成员变量字符串
二、 获取全部的构造方法get
三、 获取全部的成员方法
四、 获取类名
package top.uaoie.domain; public class Person { public String a; protected String b; String c; private String d; @Override public String toString() { return "Person{" + "a='" + a + '\'' + ", b='" + b + '\'' + ", c='" + c + '\'' + ", d='" + d + '\'' + '}'; } }
package top.uaoie.day03; import top.uaoie.domain.Person; import java.lang.reflect.Field; public class ReflectDome02 { public static void main(String[] args) throws Exception { //获取Person的Class对象,此处是在阶段二部分获取的 //也可在第一阶段获取,如:Class.forName("top.uaoie.domain.Person"); Class p = Person.class; //获取成员变量 Field[] fields = p.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println("---------------------"); Field a = p.getField("a"); System.out.println(a); //建立一个对象 Person person = new Person(); //获取成员变量a的值 Object value = a.get(person); System.out.println(value); //设置成员变量a的值 a.set(person, "这是a的值"); System.out.println(person); System.out.println("================="); Field[] declaredFields = p.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField); } Field d = p.getDeclaredField("d"); //忽略访问权限修饰符 d.setAccessible(true);//暴力反射 Object value2 = d.get(person); System.out.println(value2); } }