java学习笔记(反射、类加载器、动态代理)

时间:2022-05-09 19:37:12

一、类的加载

            A、加载

                    就是指将class文件读入内存,并为之创建一个Class对象。

                    任何类被使用时都会建立一个Class对象。

            B、连接

                    验证    是否有正确的内部结构,并和其他类协调一直

                    准备    负责为类的静态成员分布内存,并设置默认初始化值

                    解析    将类的二进制数据中的符号引用替换为直接引用

            C、初始化

                    之前讲过

二、类加载器

            负责将.class文件加载到内存中,并为之生成对应的Class对象;

         组成:

                Bootstrap ClassLoader 根类加载器:也叫引导加载器,负责核心类的加载

                Extension ClassLoader    扩展类加载器:负责扩展目录中jar包的加载

                System ClassLoader 系统类加载器 :负责在JVM启动市加载来自java命令的class文件,以及 classpath环境变量

三、反射:

            JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射机制。

            简单来说就是通过class文件对象去使用该文件中的成员变量,构造方法,成员方法;

            Class类:

                成员变量:Field        构造方法:Constructor        成员方法:Method

获取Class文件方式:

            A:Object类的getClass()方法

            B:数据类型的静态属性class

            C:Class类中的静态方法

                        public static Class forName(String classname);全路径

            开发一般使用C方法(灵活,可变化);

        

获取构造方法:

                public Constructor[] getDeclaredConstructors()返回所有构造方法;

                public Constructor getConstructor(Class(?)...parameterTypes)返回单个构造方法;参数是你要获取的参数个数和class对象

                构造方法对象.newInstance()创建对象;     构造方法对象.setAccessible(boolean)设置访问;

获取成员变量:

                getFields(),getDeclaredFields();getField();getDeclaredField()前两个得到多个,后两者得到单个

                Field对象.set(Object obj,Object value)给obj的Field属性设置为value值;

获取成员方法:与上述类似

                getMethods()获取自己和父类所有公共方法    getDeclaredMethods()获取自己所有方法

                Methods对象.invoke(对象 参数)