乐趣区

关于动态代理:动态代理速查速记

动静代理速查速记:

 动静代理
代理:原本应该本人做的事件,却请了他人来做,被请的人就是代理对象。举例:秋季回家买票让人代买

动静代理:在程序运行过程中产生的这个对象
而程序运行过程中产生对象其实就是咱们方才反射解说的内容,所以,动静代理其实就是通过反射来生成一个代理 
 在 Java 中 java.lang.reflect 包下提供了一个 Proxy 类和一个 InvocationHandler 接口,通过应用这个类和接口就能够生成动静代理对象。JDK 提供的代理只能针对接口做代理。咱们有更弱小的代理 cglib

Proxy 类中的办法创立动静代理类对象
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
最终会调用 InvocationHandler 的办法
InvocationHandler
Object invoke(Object proxy,Method method,Object[] args)
Proxy 类中创立动静代理对象的办法的三个参数;ClassLoader 对象,定义了由哪个 ClassLoader 对象来对生成的代理对象进行加载

Interface 对象的数组,示意的是我将要给我须要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就声称实现了该接口 (多态),这样我就能调用这组接口中的办法了

InvocationHandler 对象,示意的是当我这个动静代理对象在调用办法的时候,会关联到哪一个 InvocationHandler 对象上

每一个动静代理类都必须要实现 InvocationHandler 这个接口,并且每个代理类的实例都关联到了一个 handler,当咱们通过代理对象调用一个办法的时候,这个办法的调用就会被转发为由 InvocationHandler 这个接口的 invoke 办法来进行调用。InvocationHandler 接口中 invoke 办法的三个参数:proxy: 代表动静代理对象
method: 代表正在执行的办法
args: 代表调用指标办法时传入的实参

Proxy.newProxyInstance
创立的代理对象是在 jvm 运行时动静生成的一个对象,它并不是咱们的 InvocationHandler 类型,也不是咱们定义的那组接口的类型,而是在运行是动静生成的一个对象,并且命名形式都是这样的模式,以 $ 结尾,proxy 为中,最初一个数字示意对象的标号。System.out.println(u.getClass().getName());

动静代理:

package cn.itcast_06;

/*
 * 用户操作接口
 */
public interface UserDao {public abstract void add();

    public abstract void delete();

    public abstract void update();

    public abstract void find();}
package cn.itcast_06;

public class UserDaoImpl implements UserDao {

    @Override
    public void add() {System.out.println("增加性能");
    }

    @Override
    public void delete() {System.out.println("删除性能");
    }

    @Override
    public void update() {System.out.println("批改性能");
    }

    @Override
    public void find() {System.out.println("查找性能");
    }

}
package cn.itcast_06;

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

public class MyInvocationHandler implements InvocationHandler {
    private Object target; // 指标对象

    public MyInvocationHandler(Object target) {this.target = target;}

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {System.out.println("权限校验");
        Object result = method.invoke(target, args);
        System.out.println("日志记录");
        return result; // 返回的是代理对象
    }
}
package cn.itcast_06;

import java.lang.reflect.Proxy;

public class Test {public static void main(String[] args) {UserDao ud = new UserDaoImpl();
        ud.add();
        ud.delete();
        ud.update();
        ud.find();
        System.out.println("-----------");
        // 咱们要创立一个动静代理对象
        // Proxy 类中有一个办法能够创立动静代理对象
        // public static Object newProxyInstance(ClassLoader loader,Class<?>[]
        // interfaces,InvocationHandler h)
        // 我筹备对 ud 对象做一个代理对象
        MyInvocationHandler handler = new MyInvocationHandler(ud);
        UserDao proxy = (UserDao) Proxy.newProxyInstance(ud.getClass()
                .getClassLoader(), ud.getClass().getInterfaces(), handler);
        proxy.add();
        proxy.delete();
        proxy.update();
        proxy.find();}
}
退出移动版