博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射应用四:动态代理
阅读量:3965 次
发布时间:2019-05-24

本文共 2575 字,大约阅读时间需要 8 分钟。

1.代理模式的理解:

使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原 始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原 始对象上

2.静态代理:

2.1举例:

在这里插入图片描述
静态代理的缺点:
在这里插入图片描述

3.动态代理:

动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时 根据需要动态创建目标类的代理对象

体现为两方面的实现:

在这里插入图片描述

4.动态代理的典型代码:

interface  Human{
String getBelief(); void eat(String food);}//被代理类class SuperMan implements Human{
@Override public String getBelief() {
return "I believe I can fly!"; } @Override public void eat(String food) {
System.out.println("我喜欢吃" + food); }}class HumanUtil{
public void method1(){
System.out.println("====================通用方法一===================="); } public void method2(){
System.out.println("====================通用方法二===================="); }}

/*

要想实现动态代理,需要解决的问题?
问题一:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象
问题二:当通过代理类的对象调用方法a时,如何动态的去调用被代理类中的同名方法a。

*/class ProxyFactory{
//调用此方法,返回一个代理类的对象。解决问题一 public static Object getProxyInstance(Object obj){
//obj:被代理类的对象 MyInvocationHandler handler = new MyInvocationHandler(); handler.bind(obj);// static Object newProxyInstance(ClassLoader loader, 类
[] interfaces,// InvocationHandler h) 返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序 return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler); }}class MyInvocationHandler implements InvocationHandler {
private Object obj;//需要使用被代理类的对象进行赋值 public void bind(Object obj){
this.obj = obj; } //当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法:invoke()(处理代理实例上的方法调用并返回结果 //将被代理类要执行的方法a的功能就声明在invoke()中 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
HumanUtil humanUtil = new HumanUtil(); humanUtil.method1(); //method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法 //obj:被代理类的对象 Object returnValue = method.invoke(obj, args); humanUtil.method2(); //上述方法的返回值就作为当前类中的invoke()的返回值。 return returnValue; }}public class DynamicProxyTest {
public static void main(String[] args) {
SuperMan superMan = new SuperMan(); //proxyInstance:代理类的对象 Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan); String belief = proxyInstance.getBelief(); System.out.println(belief); proxyInstance.eat("火锅"); System.out.println("******************"); NikeClothFactory nike = new NikeClothFactory(); ClothFactory proxyInstance1 =(ClothFactory) ProxyFactory.getProxyInstance(nike); proxyInstance1.produceCloth(); }}

体会:反射的动态性。

转载地址:http://wtuki.baihongyu.com/

你可能感兴趣的文章
消息队列相关(MQ)
查看>>
生成短连接
查看>>
java多线程
查看>>
mybatis高级结果映射
查看>>
java 中的锁
查看>>
线程池
查看>>
深入浅出:Tomcat应用服器中Servlet容器架构及工作原理剖析
查看>>
fastjson 将json和java对象相互转换
查看>>
java获取cookie
查看>>
kafaka用例&市上最全总结
查看>>
神器 PySimpleGUI 初体验
查看>>
编程 学习视频教程大全
查看>>
查找最快的docker镜像
查看>>
AssignProcessToJobObject 错误码5 的解决办法
查看>>
windows LibreOffice 6.3.5 安装出错1355 问题解决
查看>>
libreoffice/openoffice c/c++转换office格式为pdf
查看>>
Tomcat 7.0 64位免安装解压版 安装及配置
查看>>
Android 网络编程 初级入门(一)
查看>>
No enclosing instance of type Demo06 is accessible.
查看>>
计算机发展中的两大“杀手”
查看>>