package cn.itcast2;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/*
* 动态代理:
* 被代理者
* 代理者
*
* 代理者 代理 被代理者 执行方法
* 执行方法:本来是被代理者的方法,却被代理者代理执行了
* 这里的动态:
* 代理的方法是动态的。
*
* 需求:
* 使用代理对象
* 代理Person的一个对象
* 调用help方法
*
* JDK提供的代理只能针对接口做代理。
* Proxy:代理类
* 创建动态代理类对象
* public static Object newProxyInstance( 通过该方法返回代理对象
* ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
InvocationHandler: 接口 用于定义如何代理
Object invoke(Object proxy, 这个方法定义了代理类如何代理
Method method,
Object[] args)
throws Throwable
proxy:代表代理对象,但是这里不使用!
method: 要被代理的方法 就是那个动态的方法
args:参数
*/
public class Demo {
public static void main(String[] args) {
//被代理者
Person p = new Person();
//代理者:代理对象
ClassLoader loader = p.getClass().getClassLoader();
Class<?>[] interfaces = p.getClass().getInterfaces();
//创建InvocationHandler对象
InvocationHandler ih = new MyHandler(p);
//代理对象
Object object = Proxy.newProxyInstance(loader, interfaces, ih);
Animal myProxy = (Animal)object;
//通过代理对象调用方法
myProxy.eat();
myProxy.sleep(3);
String sport = myProxy.sport();
System.out.println(sport);
}
}
|
|