动态代理的关键就是获取代理对象,获取代理对象呢又是根据JDK提供的Proxy这个类提供的方法,这个方法的参数就是需要知道被代理对象的类加载器是哪个?实现的接口是哪些?然后利用InvocationHandler这个类用反射的方式调用被代理对象的方法,代码如下:
/**
* 声明一个接口
*/
interface Human {
public void study();
}
/**
* 被代理对象
*/
class SuperMan2 implements Human {
public void study() {
System.out.println("超人也是需要学习的,要么迟早会被淘汰!");
}
}
/**
* 获取代理对象的静态方法
*/
class HumanProxy {
public static Object newInstanceProxy(Object object) {
InvocationHandler invocationHandler = new MyInvocationHandler(object);
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), invocationHandler);
}
}
/**
* 执行静态方法调用
*/
class MyInvocationHandler implements InvocationHandler {
/**
* 怎么传入实例对象呢,构造方法或者写一个方法都行
*/
private Object object;
/**
* 利用构造方法传入被代理对象
*
* @param object
*/
public MyInvocationHandler(Object object) {
this.object = object;
}
/**
* 需要传入一个被代理对象的实例
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("在学习之前最好先吃点早点,要么身体扛不住!");
Object invoke = method.invoke(object, args);
System.out.println("学习之后呢,要先及时进行练习,总结,就像现在!!");
return invoke;
}
}
public class ProxyTest2 {
@Test
public void test() {
//获取代理对象
Human o = (Human) HumanProxy.newInstanceProxy(new SuperMan2());
o.study();
}
}
输入结果:
在学习之前最好先吃点早点,要么身体扛不住!
超人也是需要学习的,要么迟早会被淘汰!
学习之后呢,要先及时进行练习,总结,就像现在!!
圣殿骑士^_^ 发布了2 篇原创文章 · 获赞 2 · 访问量 5392 私信 关注