Java 动态代理

Java动态代理的实现有两种方式:

1、jdk 自带的动态代理

2、spring 中的cglib实现的动态代理

区别:

jdk自带的动态代理一定要有接口interface类,而cglib不需要。

(1)基本信息

UserInfoService.java 类:

public interface UserInfoService {   
    String getUserName(String userName);
}
UserInfoServiceImpl类:
public class UserInfoServiceImpl implements UserInfoService{
    
    @Override
    public String getUserName(String userName) {
        return userName;
    }
}

(2)jdk 自带的动态代理

UserInfoServiceImplJdk.java

public class UserInfoServiceImpJdk implements InvocationHandler {
    
    private Object target;
    
    public Object bind(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;

        System.out.println("jdk proxy before ...");
        result = method.invoke(target, args);
        System.out.println("jdk proxy after ...");
        
        return result;
    }

    public static void main(String[] args) {
        UserInfoServiceImpl userInfoServiceImpl = new UserInfoServiceImpl();
        UserInfoServiceImpJdk userInfoServiceImpJdk = new UserInfoServiceImpJdk();
        UserInfoServiceImpl userInfoServiceImp2 = (UserInfoServiceImpl) userInfoServiceImpJdk.bind(userInfoServiceImpl);
        String result = userInfoServiceImp2.getUserName("tim");
        System.out.println(result);
    }
}

(3) Spring cglib实现的动态代理

public class UserInfoServiceImplCglib implements MethodInterceptor {
    
    private Object target;
    
    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }
    
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before cglib ....");
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("after");
        return object;
    }

    public static void main(String[] args) {
        UserInfoServiceImpl userInfoService = new UserInfoServiceImpl();
        UserInfoServiceImplCglib userInfoServiceImplCglib = new UserInfoServiceImplCglib();
        UserInfoServiceImpl userInfoService1 = (UserInfoServiceImpl)userInfoServiceImplCglib.getInstance(userInfoService);
        String result = userInfoService1.getUserName("tim");
        System.out.println(result);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值