java动态代理

代理设计模式       

        在面向对象中,java的代理模式有两种,一种是静态代理模式,另外一种是动态代理模式。虽然这两种模式都成为代理模式,但是在实际应用中已经很少使用静态代理模式了,大部分是使用动态代理模式。那么在动态代理模式中是如何实现的呢?下面的列子就是一个简单的模拟:假设PersonService是接口,PersonServiceImpl是实现类,JDKProxyFactory是代理工厂,Test是客户端。当PersonServiceImpl的user不为空的时候,就可以访问PersonServiceImpl的add()方法,为空的时候,就没有权限访问。使用动态代理模式,可以让我们的代码变得更加灵活...在维护的时候也更加容易。下面给出一个简单的动态代码模式的代码:
/*
 *   接口PersonService
 * */
public interface PersonService{
    public void save();

    public void add();

    public void update();
}

/**
 *    模拟动态代理
 * */
public class PersonServiceImpl implements PersonService{
    private String user;

    public PersonServiceImpl(String user){
        this.user = user;
    }

    //给外部提供接口
    public String getUser(){
        return user;
    }

    public void add(){
        System.out.println("I am the PersonServiceImpl add() method");
    }
    public void update(){
    }

    public void save(){
    }
}

import java.lang.reflect.*; 
/*在这里,直接让工厂实现了InvocationHandler,所以在调用createProxy()的时候,给Proxy.netProxyInstance()的第三个参数传进去了一个this,如果要把工厂和InvocationHandler解耦,可以重新顶一个实现InvocationHandler的类*/
public class JDKProxyFactory implements InvocationHandler{
     
    //要代理的目标对象
    private Object target;

    public JDKProxyFactory(Object obj){
        target = obj;
    }
    
    //生产一个代理对象
    public Object createProxy(){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    
    //当客户端调用目标对象进行工作的时候,就会被这个代理对象拦截到    
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
        //将目标对象向下转型
        PersonServiceImpl bean = (PersonServiceImpl)target;
        //这里进行拦截
        if(bean.getUser() != null && !"".equals(bean.getUser())){
            //调用目标对象的方法
            Object result = method.invoke(target, args);
            return result;
        }else{
            System.out.println("sorry, you have no limitation to access this resource!!!");
            return null;
        }
    }
}



        


你可能感兴趣的:(java动态代理)