package com.yl.pdfdemo.day08.p6;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @Author wfj
* @Date 2021/7/13
* @Description 动态代理例子
* @Version 1.0
*/
public class ProxyTest {
public static void main(String[] args) {
SuperMan superMan = new SuperMan();
//获取代理对象
Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan);
//当通过代理对象调用方法时,会自动调用被代理类中的同名的方法
System.out.println(proxyInstance.getName());
proxyInstance.run();
}
}
interface Human{
String getName();
void run();
}
//被代理类
class SuperMan implements Human {
@Override
public String getName() {
return "superman...";
}
@Override
public void run() {
System.out.println("supperman run!!!");
}
}
class ProxyFactory{
//通过此方法获取代理对象,object参数为被代理对象
public static Object getProxyInstance(Object object) {
MyInvocationHandler handler = new MyInvocationHandler();
handler.bind(object);
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler);
}
}
class MyInvocationHandler implements InvocationHandler {
private Object object; //需要使用被代理类的对象进行赋值
public void bind(Object obj) {
this.object = obj;
}
//当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法:invoke()
//将被代理类要执行的方法a的功能就声明在invoke()中
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//method即为代理类对象调用的方法,此方法也就作为了被代理对象要调用的方法
//obj, 被代理对象
Object value = method.invoke(object, args);
return value;
}
}
java 动态代理例子
最新推荐文章于 2023-05-18 08:31:12 发布