java反射之動態代理學習筆記

farsun發表於2021-09-09

動態代理概述:
代理:本來自己做的事情,請別人來做,被請的人就是代理物件;
舉例:春節回家買票讓人代理買
動態代理:在程式執行過程中產生的這個物件,而程式執行過程中產生物件其實就是我們剛才反射講解的內容,所以動態代理其實就是透過反射來生成一個代理。
在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;    }}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4289/viewspace-2817708/,如需轉載,請註明出處,否則將追究法律責任。

相關文章