java代理的几种实现

一.静态代理
1。先定义一个接口以及接口中的方法

public interface UserInterface {

    void save();

}

2。接口的实现类

/**
 * 接口实现
 * 目标对象
 */
public class User implements UserInterface{

    @Override
    public void save() {
        // TODO Auto-generated method stub
        System.out.println("执行了User对象的save方法");
    }
}

3。编写代理类

public class UserProxy implements UserInterface{

    private User target;
    public UserProxy(User target){
        this.target = target;
    }

    public void save(){
        System.out.println("开始执行UserProxy类的save方法");
        target.save();
        System.out.println("结束执行UserProxy类的save方法");
    }
}

4。测试类

public class Test {

    /**
     * 
     * 静态代理总结:
1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
2.缺点:
因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
如何解决静态代理中的缺点呢?答案是可以使用动态代理方式
     * @param args
     */
    public static void main(String[] args) {
        User user = new User();

        UserProxy userProxy = new UserProxy(user);

        userProxy.save();
    }
}

二。动态代理

1。代理工厂

public class ProxyFactory {

    private Object target;

    public ProxyFactory(Object target){
        this.target = target;
    }
//  public Object getProxyInstance(){
//      return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
//          
//          @Override
//          public Object invoke(Object proxy, Method method, Object[] args)
//                  throws Throwable {
//              // TODO Auto-generated method stub
//              System.out.println("开始执行代理");
//              Object returnValue = method.invoke(target, args);
//              System.out.println("结束了执行代理");
//              return returnValue;
//          }
//      });
//  }

    public Object getProxyInstance(){
        //被代理类的类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //被代理类的接口
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //代理类执行,执行某个类的某个方法,并传入方法入参,获得返回值
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                // TODO Auto-generated method stub
                System.out.println("开始执行代理");
                Object returnValue = method.invoke(target, args);
                System.out.println("结束了执行代理");
                return returnValue;
            }
        };
        //返回代理类
        Object proxy = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        return proxy;
    }
}

2。测试类(主要就是定义的时候,都定义为接口类型,具体实现看具体情况)

public class Test {

    public static void main(String[] args) {
        UserInterface target = new User();
        System.out.println(target.getClass());
        UserInterface proxy = (UserInterface) new ProxyFactory(target).getProxyInstance();
        System.out.println(proxy.getClass());
        proxy.save();
    }
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值