java动态代理理解

实现代码

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

public class DemoMain {

    public static void main(String[] args) {// 动态代理
        // TODO Auto-generated method stub
        Arithmetic ariImpl = new ArithmeticImpl();

        Arithmetic ari = (Arithmetic) Proxy.newProxyInstance(ariImpl.getClass().getClassLoader(),
                new Class[] { Arithmetic.class }, new InvocationHandler() {
                    //new Class[] {} 填写是个接口集合的类
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // method 被调用的方法
                        // args方法里面带有的参数
                        System.out.println(method.getName());
                        Object result = method.invoke(ariImpl, args);
                        return result;
                    }
                });
        System.out.println(ari.add(2, 3));
    }
}

jdk代理方式实现

import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
import java.lang.reflect.Proxy;  
/**  
 * JDK动态代理类 
 */  
public class JDKProxy implements InvocationHandler {  //调用处理器

    private Object targetObject;//需要代理的目标对象  

    public Object newProxy(Object targetObject) {//将目标对象传入进行代理  
        this.targetObject = targetObject;   
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),  
                targetObject.getClass().getInterfaces(), this);//返回代理对象  
    }  

    public Object invoke(Object proxy, Method method, Object[] args)//invoke方法  
            throws Throwable {  
        checkPopedom();//一般我们进行逻辑处理的函数比如这个地方是模拟检查权限  
        Object ret = null;      // 设置方法的返回值  
        ret  = method.invoke(targetObject, args);       //调用invoke方法,ret存储该方法的返回值  
        return ret;  
    }  

    private void checkPopedom() {//模拟检查权限的例子  
        System.out.println(".:检查权限  checkPopedom()!");  
    }  
}  

CGLIB动态代理

import java.lang.reflect.Method;  

import net.sf.cglib.proxy.Enhancer;  
import net.sf.cglib.proxy.MethodInterceptor;  
import net.sf.cglib.proxy.MethodProxy;  

/** 
 * CGLibProxy动态代理类的实例   
 */  
public class CGLibProxy implements MethodInterceptor { //方法拦截器 

    private Object targetObject;// CGLib需要代理的目标对象  

    public Object createProxyObject(Object obj) {  
        this.targetObject = obj;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(obj.getClass());  
        enhancer.setCallback(this);  
        Object proxyObj = enhancer.create();  
        return proxyObj;// 返回代理对象  
    }  

    public Object intercept(Object proxy, Method method, Object[] args,  
            MethodProxy methodProxy) throws Throwable {  
        Object obj = null;  
        if ("addUser".equals(method.getName())) {// 过滤方法  
            checkPopedom();// 检查权限  
        }  
        obj = method.invoke(targetObject, args);  
        return obj;  
    }  

    private void checkPopedom() {  
        System.out.println(".:检查权限  checkPopedom()!");  
    }  
}  

接口

public interface Arithmetic {
int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
int div(int a,int b);
}

继承接口

public class ArithmeticImpl implements Arithmetic{

    @Override
    public int add(int a, int b) {
        // TODO Auto-generated method stub
        return a+b;
    }

    @Override
    public int sub(int a, int b) {
        // TODO Auto-generated method stub
        return a-b;
    }

    @Override
    public int mul(int a, int b) {
        // TODO Auto-generated method stub
        return a*b;
    }

    @Override
    public int div(int a, int b) {
        // TODO Auto-generated method stub
        if(b!=0)
        return a/b;
        else
        return 0;
    }
}

实现

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值