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()");
}
}
