JDk动态代理

java当中jdk的动态代理是基于接口实现的,而动态代理要求被代理的必须是接口的实现类,否则无法为其创建相应的动态实例。

public interface Dog{
    void info();
    void run();
}
                  
//实现类
public class DogImpl implements Dog{
    public void info(){
        System.out.println("dog  dog");
}
                  
public void run(){
    System.out.println(" dog is running!");
}
}
//动态代理类
public  class   DogIntercepter{
    public void method1(){
        System.out.println("sdfdfs");
}
                  
public void method2(){
        System.out.println("dfdfdfdfdfdf");
}
}
//jdk的代理类需要实现InvocationHandler接口
public class ProxyHandler implements InvocationHandler{
    //需要被代理的目标对象
    private Object target ;
    //创建拦截器实例
    DogIntercepter di = new DogIntercepter();
    //执行代理的目标方法时,该invoke方法会被自动调用
public Oobject invoke(Object proxy,Method method,Object[] args){
    Object resullt = null;
    //如果被调用的方法为info
    if(method.getName().equals("info"){
        //调用拦截器方法
        di.method1();
        result = method.invoke(target,args);
        //调用拦截器方法2
        di.method2();
    }else{
        result = method.invoke(target,args);
    }
    return result ;
}
//用于设置传入目标对象的方法
public void setTarget(Object o){
    tartget = o ;
}
//系统还需要提供一个代理工厂,作用是根据目标对象生成一个代理对象
public class MyProxyFactory{
    public static Object getProxy(Object obj){
        //代理的处理类
        ProxyHandler handler = new ProoxyHandler();
        //把dog托付给代理操作
        handler.setTartget(object);
        //第一个参数是用来创建动态代理的Classloader对象
        //只要该对象能访问dog借口即可
        //第二个是接口数组,第三个是代理包含的处理实例
        return Proxy.newProxyInstance(DogImpl.class.getClassLoader(),obj.getClass().getInstance(),handler);
    }
}
//下面测试
public class Main{
 public static void main(String args[]){
    Dog targetObject = new DogImpl();
    Dog dog = null ;
    //以目标对象创建代理
    Object proxy = MyProxyFactory.getProxy(targetObject);
    if(proxy instanceof Dog){
        dog =(Dog)proxy ;
    }
    dog.info();
    dog.run();
    }
}


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