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

动静代理速查速记:

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

动静代理:在程序运行过程中产生的这个对象
而程序运行过程中产生对象其实就是咱们方才反射解说的内容,
所以,动静代理其实就是通过反射来生成一个代理
在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();
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理