类加载器 & 注解 & 动态代理

     一、什么是类加载器,作用是什么?

                类加载器就是加载字节码文件(.class)到内存中

         1.   类加载器的种类(三种)

                      BootStrap:引导类加载器:加载都是最基础的文件

                      ExtClassLoader:扩展类加载器:加载都是基础的文件

                      AppClassLoader:应用类加载器:三方jar包和自己编写java文件

          2.    怎样获得类加载器

                     ClassLoader 字节码对象.getClassLoader();

                     Class   class = 类名.class  //获得类字节码对象

                      ClassLoader   classLoader = class .getClassLoader();   //获得类加载器

                       classLoader .getResource(这里是你要获得资源的路径).getpath();      //获得classes(src)下的任何资源

  二、 注解

            1、什么是注解,有什么作用   

                   注解就是符合一定格式的语法 @xxxx

                         注解作用:

                             注释:在阅读程序时清楚----给程序员看的

                             注解:给jvm看的,给机器看的   

                        注解在目前而言最主流的应用:代替配置文件

                               关于配置文件与注解开发的优缺点:

                               注解优点:开发效率高 成本低 

                               注解缺点:耦合性大 并且不利于后期维护

              2、jdk5提供的注解

                           

                   @Override:告知编译器此方法是覆盖父类的

                   @Deprecated:标注过时

                   @SuppressWarnings:压制警告

                     发现的问题:

                              不同的注解只能在不同的位置使用(方法上、字段上、类上)

                     

        三、动态代理

                 1、 什么是代理

                      目标对象/被代理对象 ------ 房主:真正的租房的方法

                      代理对象 ------- 黑中介:有租房子的方法(调用房主的租房的方法)

                      执行代理对象方法的对象 ---- 租房的人

                      流程:我们要租房----->中介(租房的方法)------>房主(租房的方法)

                      抽象:调用对象----->代理对象------>目标对象

                 2、 获得动态代理对象

            //获得动态的代理对象----在运行时 在内存中动态的为Target创建一个虚拟的代理对象
        //objProxy是代理对象 根据参数确定到底是谁的代理对象
        TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance(
                Target.class.getClassLoader(), //与目标对象相同的类加载器
                new Class[]{TargetInterface.class},
                new InvocationHandler() {
                    //invoke 代表的是执行代理对象的方法
                    @Override
                    //method:代表目标对象的方法字节码对象
                    //args:代表目标对象的响应的方法的参数
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("目标方法前的逻辑");
                        //执行目标对象的方法
                        Object invoke = method.invoke(new Target(), args);
                        System.out.println("目标方法后的逻辑");
                        return invoke;
                    }
                }
            );
        
        objProxy.method1();
        String method2 = objProxy.method2();
        System.out.println(method2);
        
    }

          

 

     

                    

                     

   

                

猜你喜欢

转载自blog.csdn.net/qq_38726370/article/details/85283150