1.优点
动态的生成代理类,而不用像静态代理一样,在编译期间进行定义类。动态代理更加灵活,不用显示的在所有方法前面或者后面加入权限验证、记录日志等操作。
2. Proxy.newProxyInstance()方法的参数含义
方法:Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)
第一个参数ClassLoader是类加载器,作用是用来生成类。
第二个参数interfaces是获取真实对象的所有接口,获取所有接口的目的是用来生成代理,因为代理要实现所有的接口
第三个参数InvocationHandler是调用处理器,这里传入调用处理器,是因为生成代理实例需要调用处理器,至于为什么需要调用处理器,是因为生成的代理不能直接调用真实对象的方法,而是通过调用处理器来调用真实对象的方法,具体就是MyProxyHandler重写父类的InvocationHandler的invoke方法来调用真实对象的方法。
3. jdk怎样动态生成代理类并实例化的?
我们重头到尾都没有看到像静态代理类那样的一个动态代理类,那么JDK的Proxy是怎么得到动态代理类的实例的呢?真的不建立一个类,就能获取该类的实例吗?
答:
这是不可能的,Java中必须要有类,才会有该类的实例。其实不是没有代理类,而是JDK在运行期间帮我们生成了一个代理类的字节码,通过类加载器加载这个字节码,然后执行引擎进行一系列处理后生成代理类,再进行实例化。
4.动态代理和静态代理的区别
静态代理与动态代理的区别在于代理类生成的时间不同,静态代理的代理类是在编译期间就已经存在的,动态代理的代理类是在运行时通过反射生成的。如果需要对多个类进行代理,并且代理的功能都是一样的,用静态代理重复编写代理类就非常的麻烦,可以用动态代理动态的生成代理类。
5. jdk动态代理过程具体步骤
jdk动态代理的过程都做了哪些工作呢?具体有以下6个步骤:
1.获取委托类也就是Myself上的所有接口。2.生成代理,生成的代理的名称也是有规律的,一般是在com.sun.proxy.$ProxyXXX。3.动态创建代理类的字节码信息,也就是class文件。4.根据class文件创建Class对象。5.创建自己的InvocationHandler并实现InvocationHandler重写invoke方法,实现对委托类方法的调用和增强。6.最后是代理对象的创建,并调用方法,实现代理的功能。
