栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JDK代理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JDK代理

jdk代理分为两类:

1. jdk动态代理

2.jdk静态代理

  开始讲jdk动态代理

   jdk动态代理分为两种,一种是jdk自带的代理,另一种是spring的cglib代理

    先讲jdk自带的代理:代理对象,不需要实现接口

JDK中生成代理对象的API

代理类所在包:java.lang.reflect.Proxy

JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:

static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h )

package com.study.test.ProxyInstance;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyInstance {
    public static void main(String[] args) {
        IStar star =  new LiuDeHuaStar();
        IStar proxy = (IStar) Proxy.newProxyInstance(
JdkProxyInstance.class.getClassLoader(), //获取当前的类加载器
new Class[]{IStar.class}, //获取代理的接口
new InvocationHandler() {  //代理对象的逻辑业务判断
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Double money = (Double) args[0];
                if (money > 2000) {
                    return method.invoke(star, args);
                } else {
                    System.out.println("时间不够,有机会下次合作!");
                }
                return null;
            }
        });
        proxy.party(100);
        proxy.party(10000);

    }
}

interface IStar {
    void party(double money);
}

class LiuDeHuaStar implements IStar {
    @Override
    public void party(double money) {
        System.out.println("华仔开趴体,气氛很愉悦!");
    }
}

小结:

  1. JDK代理: 目标对象必须实现接口,否则不能使用。

CGLib代理:

package com.study.test.ProxyInstance;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class CglibProxyInstance {
    public static void main(String[] args) {
        IStar01 star = new LiuDeHuaStar01();
        
        IStar01 proxy = (IStar01) Enhancer.create(
LiuDeHuaStar01.class, 
new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                // 获取当前执行的方法参数
                double money = (double) args[0];
                // 判断
                if (money > 2000) {
                    // 调用目标对象的方法
                    return method.invoke(star, args);
                } else {
                    System.out.println("档期忙,后期再合作!");
                }
                return null;
            }
        });
        proxy.party(100);
        proxy.party(10000);

    }
}

interface IStar01 {
    void party(double money);
}

class LiuDeHuaStar01 implements IStar01 {
    @Override
    public void party(double money) {
        System.out.println("华仔开趴体,气氛很愉悦!");
    }
}

小结

1.cglib代理 也叫做自雷代理,运行时期对目标对象动态生成子类,

2.要求,目标对象不能为final,否则报错,因为生成不了子类

3.目标对象的方法如果为final,static,就不会执行事件处理程序,就不能扩展,会直接执行目标对象的方法

cglib的要求就是上面的,比jdk动态代理要求必须有接口的限制小

静态代理:

package com.study.test.ProxyInstance;



public class ProxyInstance {

    public static void main(String[] args) {
        IStar02 proxy = new LiuDeHuaProxy();
        proxy.party(100);
        proxy.party(10000);
    }
}

interface IStar02 {
    void party(double money);
}

class LiuDeHuaStar02 implements IStar02 {
    @Override
    public void party(double money) {
        System.out.println("华仔开趴体,气氛很愉悦!");
    }
}
class LiuDeHuaProxy implements IStar02 {
    IStar02 star=  new LiuDeHuaStar02();
    @Override
    public void party(double money) {
     if (money>2000){
         star.party(2000);
     }else {
         System.out.println("档期忙,后期再合作!");
     }
    }
}

静态代理总结:

1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.

2.缺点:

一个目标对象,一个代理对象,导致代理类过多;

代理对象需要与目标对象实现一样的接口,一旦接口增加方法,目标对象与代理对象都要维护.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390232.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号