Loading... ## 定义 Reflection `Java反射`是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法,属性和父类等信息,还包括实例的创建和实例类型的判断等。 ---------- ## Class类 描述类的类 对于每个类而言,JRE都为其保留了一个不变的Class类型的对象,一个Class对象包含了特定某个结构的有关信息(属性,方法,构造器) * Class本身也是一个类 * Class对象只能由系统建立对象(用户使用反射获取) * 一个加载的类在JVM中只会有一个Class实例 * 每个类的实例都会记得自己是由哪个Class实例所生成 * 通过Class可以完整得到一个类中所有被加载的结构 * Class类是反射的根源,想要动态加载运行类,都需要先获得相应Class对象 ---------- ## Class实例的获得方式 #### 1. 通过具体对象获得 ```java Person person = new Student(); Class c1 = person.getClass(); ``` #### 2. 通过forname ```java Class c2 = Class.forName("com.xxx.Student"); ``` #### 3. 通过类名.class ```java Class c3 = Student.class; ``` #### 4. 通过一个Class实例的获得其父类Class实例 ```java Class c4 = c1.getSuperClass(); ``` ---------- ## 所有类型对应的Class ```java public static void main(String[] args) { Class c1 = Object.class; // 类 Class c2 = Comparable.class; // 接口 Class c3 = String[].class; // 一维数组 Class c4 = int[][].class; // 二维数组 Class c5 = Override.class; // 注解 Class c6 = ElementType.class; // 枚举 Class c7 = int.class; // 基本数据类型 Class c8 = void.class; // void Class c9 = Class.class; // Class System.out.println(c1); System.out.println(c2); System.out.println(c3); System.out.println(c4); System.out.println(c5); System.out.println(c6); System.out.println(c7); System.out.println(c8); System.out.println(c9); } ``` 输出 ``` class java.lang.Object interface java.lang.Comparable class [Ljava.lang.String; class [[I interface java.lang.Override class java.lang.annotation.ElementType int void class java.lang.Class ``` ---------- ## 类的加载 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://www.fangshirui.cn/index.php/archives/393/" target="_blank" class="post_inser_a no-external-link"> <div class="inner-image bg" style="background-image: url(https://fangshirui.cn/usr/uploads/2020/09/2303202401.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">Java-[类加载]</p> <div class="inster-summary text-muted"> 类加载的整个过程加载、验证、准备、解析、初始化。1. 加载加载阶段是类加载过程的第一个阶段。他们俩不要混淆。在加载... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> ---------- ## 获得Class实例结构信息 ```java public static void main(String[] args) throws ClassNotFoundException { Class c1 = Class.forName("com.syn.BuyTicket"); Field[] fields = c1.getFields(); // 获取公共属性 for (Field field : fields) { System.out.println(field); } System.out.println("==========="); fields = c1.getDeclaredFields(); // 获取所有属性 for (Field field : fields) { System.out.println(field); } System.out.println("========="); Method[] methods = c1.getMethods(); // 获取本类及父类的所有public方法 for (Method method : methods) { System.out.println(method); } System.out.println("============"); methods = c1.getDeclaredMethods(); // 获取本类所有方法 for (Method method : methods) { System.out.println(method); } } ``` ---------- ## 通过反射动态创建对象 ```java public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class c1 = Class.forName("com.reflection.User"); // 构造一个对象 User user = (User) c1.newInstance(); // 本质是调用无参构造器 System.out.println(user); // 通过构造器 Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class); User user2 = (User) constructor.newInstance("fsr", 1212, 22); System.out.println(user2); } ``` ---------- ## 反射操作注解 通过注解和反射可以完成ORM,即对象关系映射,也就是类和表结构的映射关系。 ```java ``` 最后修改:2020 年 07 月 28 日 11 : 25 AM © 允许规范转载