騰訊傻白甜?游說集團和旋轉門了解一下?


https://www.bilibili.com/video/BV1ui4y137d3

package com.example.proxydemo.dynamicproxy;

import com.example.proxydemo.subject.Subject;
import com.example.proxydemo.subject.SubjectImpl;

import java.lang.reflect.Proxy;

public class DynamicProxyTest {

    public static void main(String[] args) {
        //1.創建目標對象
        SubjectImpl realSubject = new SubjectImpl();

        //2.創建調用處理器對象
        ProxyHandler proxyHandler = new ProxyHandler(realSubject);

        //3.動態生成代理對象
        Subject proxySubject =
                (Subject) Proxy.newProxyInstance(
                SubjectImpl.class.getClassLoader(),
                SubjectImpl.class.getInterfaces(), proxyHandler
        );

        //4.客戶端通過代理對象調用方法
        //本次調用將自動被代理處理器的invoke方法接收
        proxySubject.request();

        proxySubject.response();

        System.out.println(proxySubject.getClass().getName());
    }
}

package com.example.proxydemo.dynamicproxy;

import com.example.proxydemo.subject.Subject;

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

/**
 * 代理類的調用處理器
 * @author ukyoZq
 */
public class ProxyHandler implements InvocationHandler {

    private Subject subject;

    public ProxyHandler(Subject subject){
        this.subject = subject;
    }

    /**
     * 此函數在代理對象調用任何一個方法時都會被調用
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(proxy.getClass().getName());
        //定義預處理的工作,當然你也可以根據method的不同進行不同的預處理工作
        System.out.println("====before====");
        Object result = method.invoke(subject, args);
        System.out.println("====after====");
        return result;
    }
}

package com.example.proxydemo.multiple;

public interface Cook {
    void doWork();
}

package com.example.proxydemo.multiple;

public class CookImpl implements Cook{
    @Override
    public void doWork() {
        System.out.println("Cook for myself");
    }
}

package com.example.proxydemo.multiple;

public interface Driver {
    void doWork();
}

package com.example.proxydemo.multiple;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * https://www.icourse163.org/learn/ECNU-1206500807?tid=1206823217
 * @author ukyoZq
 * @date 2020/4/18
 */
public class MultipleInterfacesProxyTest {

    public static void main(String[] args) throws Exception {
        Cook cook = new CookImpl();
        //創建指定類的類加載器
        ClassLoader c1 = MultipleInterfacesProxyTest.class.getClassLoader();
        ProxyHandler handler = new ProxyHandler(cook);

        //生成代理類型 這里的聲明順序是有關系的
        Class<?> proxyClass = Proxy.getProxyClass(c1, new Class<?>[]{Cook.class, Driver.class});

        //生成代理對象
        Object proxy = proxyClass.getConstructor(new Class[]{InvocationHandler.class})
                .newInstance(new Object[]{handler});
        System.out.println(Proxy.isProxyClass(proxyClass));

        Proxy p = (Proxy) proxy;
        System.out.println(Proxy.getInvocationHandler(proxy).getClass().getName());
        System.out.println("proxy類型:"+proxyClass.getName());

        //代理對象都繼承於java.lang.reflect.Proxy,但是獲取父類確實Object而不是Proxy
        Class father = proxyClass.getSuperclass();
        System.out.println("proxy的父類類型:"+father.getName());

        Class[] cs = proxy.getClass().getInterfaces();

        for(Class c:cs){
            System.out.println("proxy的父接口類型:"+c.getName());
        }
        System.out.println("============================");

        Method[] ms = proxy.getClass().getMethods();
        for (Method m:ms){
            System.out.println("調用方法"+m.getName()+":參數為"+ Arrays.deepToString(m.getParameters()));
        }
        System.out.println("=============================");

        Cook c = (Cook)proxy;
        c.doWork();

        Driver d = (Driver)proxy;
        d.doWork();
    }
}

package com.example.proxydemo.multiple;

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

/**
 * 代理類的調用處理器
 */
public class ProxyHandler implements InvocationHandler {

    private Cook cook;

    public ProxyHandler(Cook cook){
        this.cook = cook;
    }

    //此函數在代理對象調用任何一個方法時都會被調用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("proxy類型:"+proxy.getClass().getName());
        System.out.println("調用方法:"+method+":參數為:"+Arrays.deepToString(args));
        Object result = method.invoke(cook, args);
        return result;
    }
}

package com.example.proxydemo.staticproxy;

import com.example.proxydemo.subject.Subject;

/**
 * 靜態代理對象
 * @author ukyoZq
 */
public class StaticProxy implements Subject {
    //實際目標對象
    private Subject subject;

    public StaticProxy(Subject subject){
        this.subject = subject;
    }

    @Override
    public void request() {
        System.out.println("PreProcess");
        subject.request();
        System.out.println("PostProcess");
    }

    @Override
    public void response() {

    }
}

package com.example.proxydemo.staticproxy;

import com.example.proxydemo.subject.SubjectImpl;

public class StaticProxyTest {

    public static void main(String[] args) {
        //創建實際對象
        SubjectImpl subject = new SubjectImpl();
        //把實際對象封裝到代理對象中
        StaticProxy p = new StaticProxy(subject);
        p.request();

    }
}

package com.example.proxydemo.subject;

/**
 * 被代理對象
 * @author ukyoZq
 */
public interface Subject {

    void request();

    void response();

}

package com.example.proxydemo.subject;

public class SubjectImpl implements Subject{
    @Override
    public void request() {
        System.out.println("SubjectImpl request()");
    }

    @Override
    public void response() {
        System.out.println("SubjectImpl response()");
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM