java静态代理和动态代理实现代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_royi/article/details/86535472

java静态代理和动态代理

  java设计模式中,常说的代理模式使用的是静态代理模式。

代理模式:为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

  • 静态代理:由创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
  • 动态代理:在程序运行时运用反射机制动态创建而成。

静态代理代码

  接口和实现类

public interface FoodService {
    public void makeNoodle();
    public void makeChicken();
}

public class FoodServiceImpl implements FoodService {
    @Override
    public void makeNoodle() {
        System.out.println("make noodle");
    }

    @Override
    public void makeChicken() {
        System.out.println("make Chicken");
    }
}

  静态代理类

public class StaticProxy implements FoodService {

    private FoodService foodService;
    public StaticProxy(FoodService foodService){
        this.foodService = foodService;
    }
    @Override
    public void makeNoodle() {
        foodService.makeNoodle();
    }

    @Override
    public void makeChicken() {
        foodService.makeChicken();
    }
}

  调用类

public class Client {
    public static void main(String[] args) {
        StaticProxy staticProxy = new StaticProxy(new FoodServiceImpl());
        staticProxy.makeChicken();
    }

}

动态代理

  接口和实现类

public interface FoodService {
    public void makeNoodle();
    public void makeChicken();
}

public class FoodServiceImpl implements FoodService {
    @Override
    public void makeNoodle() {
        System.out.println("make noodle");
    }

    @Override
    public void makeChicken() {
        System.out.println("make Chicken");
    }
}

  动态代理类

//Object proxy:被代理的对象
//Method method:要调用的方法
//Object[] args:方法调用时所需要参数
public class DynamicProxy implements InvocationHandler {
    //目标对象
    private Object target;
    //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
    public Object newProxyInstance(Object targetObject){
        this.target=targetObject;
        //该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
        //第一个参数指定产生代理对象的类加载器,需要将其指定为和目标对象同一个类加载器
        //第二个参数要实现和目标对象一样的接口,所以只需要拿到目标对象的实现接口
        //第三个参数表明这些被拦截的方法在被拦截时需要执行哪个InvocationHandler的invoke方法
        //根据传入的目标返回一个代理对象
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(),this);
    }
    @Override
    //关联的这个实现类的方法被调用时将被执行
    /*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法,args表示方法的参数*/
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
          //打印参数
//        for(int i=0;i<args.length;i++){
//            System.out.println(args[i]);
//        }
        Object ret=null;
        try{
            //调用目标方法
            ret=method.invoke(target, args);
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
        return ret;
    }
}

  调用类

public class Client {
    public static void main(String[] args){
        DynamicProxy dynamicProxy=new DynamicProxy();
        FoodService foodService=(FoodService)dynamicProxy.newProxyInstance(new FoodServiceImpl());
        //UserManager userManager=new UserManagerImpl();
        foodService.makeChicken();
    }
}

猜你喜欢

转载自blog.csdn.net/c_royi/article/details/86535472