手记

java反射之动态代理学习笔记

动态代理概述:
代理:本来自己做的事情,请别人来做,被请的人就是代理对象;
举例:春节回家买票让人代理买
动态代理:在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以动态代理其实就是通过反射来生成一个代理。
在java 中java.lang.reflect包提供一个proxy类和一个invocationHandler接口,通过使用这个类和接口就可以生成动态代理对象,JDk提供代理只能针对接口做代理,我们有更强大的代理cglib、proxy类中的方法创建动态代理对象。
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)

测试方法一

/**     * @param args     */    public static void main(String[] args) {        /*UserImp ui = new UserImp();        ui.add();        ui.delete();        System.out.println("-------------------------------");*/        /*         * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,         * InvocationHandler h)         */        /*MyInvocationHandler m = new MyInvocationHandler(ui);        User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m);        u.add();        u.delete();*/        StudentImp si = new StudentImp();        si.login();        si.submit();        System.out.println("-------------------------------");        MyInvocationHandler m = new MyInvocationHandler(si);        Student s = (Student)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass().getInterfaces(), m);        s.login();        s.submit();    }

方法二

public interface User {    public void add();    public void delete();}

方法三

public class UserImp implements User {    @Override    public void add() {        //System.out.println("权限校验");        System.out.println("添加功能");        //System.out.println("日志记录");    }    @Override    public void delete() {        //System.out.println("权限校验");        System.out.println("删除功能");        //System.out.println("日志记录");    }}

方法四

public class StudentImp implements Student {    @Override    public void login() {        System.out.println("登录");    }    @Override    public void submit() {        System.out.println("提交");    }}

方法五

public interface Student {    public void login();    public void submit();}

方法六

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("权限校验");        method.invoke(target, args);                    //执行被代理target对象的方法        System.out.println("日志记录");        return null;    }}

0人推荐
随时随地看视频
慕课网APP