反射
1. 概述
-
概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
-
相关的类
-
Class ***
-
Constructor
-
Method
-
Filed
-
Modifier
-
2. Class 概述
-
Class
没有公共构造方法。class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass
方法自动构造的。 -
任何的一个类智能对应唯一的一个Class 对象。唯一的大Class 对象,是通过jvm类加载机制实现的。
3. 获得一个类的 Class 对象的三种方式
package com.qf.reflect;
/**
* 反射:reflection
*
* 概念:**JAVA反射机制**是在【运行状态】中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;
* 这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
*
* 实现反射机制最核心的类:一个类的 Class 对象。
* 通过 操作 一个 类的Class 对象,可以访问类中的方法,创建对象等等。
*
* 相关的类:
* java.lang.Class
* 描述类的类。描述类中有什么方法,有什么属性,有什么父类,有什么父接口,有什么构造方法,有什么内部类。等等..
* 通过该类对象,可以知道对应的类的结构。
* java.lang.reflect.Method
* 描述类中的方法的类。修饰符、方法名、参数列表...
* java.lang.reflect.Field.
* 描述类中的属性的类。
* java.lang.reflect.Constructor
* 描述类中的构造方法的类。
* java.lang.reflect.Modifier
* 描述类成员的各种修饰符。
*
* 如何获得一个类的Class对象。
* 三种方式:
* 1:类名.class
* 使用的场景:
* 1:作为对象的监视器使用,同步锁。
* 2:作为方法的实参。
* 3:没有执行类加载的最后一步,类的初始化。
*
* 2:通过 对象.getClass();
* Object 类的 getClass() 返回的是 当前对象对应的类型的Class 对象。
* 使用的场景:
* 1:判断两个对象是否是同种类型。判断对象你的实际类型。
* instanceof 没有该方法准确。
* 2:有执行类加载的最后一步,类的初始化。
*
* 3:使用 Class 类中的静态方法。Class.forName(类的全路径名);
* 1:有执行类加载的最后一步,类的初始化。
*
*
*
*/
public class TestReflect {
public static void main(String[] args)throws Exception {
// 类名.class
Class<A> clazz1 = A.class;
// 通过 对象.getClass();
A a = new A();
Class<? extends A> clazz2 = a.getClass();
//
A a1 = new B();
System.out.println(a1 instanceof A);//true
System.out.println(a1.getClass() == A.class);//false
//
//// 使用 Class 类中的静态方法。Class.forName(类的全路径名);
Class<?>