详解java * 模式
作者:lijiao 发布时间:2023-03-29 13:39:29
标签:java, , ,代理模式
本文针对java * 进行知识点整理,具体内容如下
一. JAVA的 * (比较官方说法)
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种。
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
* :在程序运行时,运用反射机制动态创建而成。
二. * 实现
java.lang.reflect.Proxy,
Proxy 提供用于创建 * 类和实例的静态方法.
newProxyInstance()
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
2.1. Dao接口(提供模拟数据访问层接口)
package javaproxy;
/*
* 定义一个数据访问层接口
*/
public interface Dao {
//模拟数据保存
public void save();
}
2.2. DaoImpl类实现类
package javaproxy;
public class DaoImpl implements Dao{
@Override
public void save() {
System.out.println("执行一个保存方法。。。。。。。。。。。。");
}
}
2.3. 代理处理类
package javaproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DaoHandler implements InvocationHandler{
private Object obj;
public DaoHandler(Object obj) {
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("do something before method");//这里模拟AOP的前置方法
Object ret = method.invoke(this.obj, args);
System.out.println("do something after method");//这里模拟AOP的后置方法
return ret;
}
}
2.4. client调用
package javaproxy;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
// 元对象(被代理对象)
DaoImpl daoImpl = new DaoImpl();
// 业务代理类
DaoHandler daoHandler=new DaoHandler(daoImpl);
Dao dao=(Dao) Proxy.newProxyInstance(daoImpl
.getClass().getClassLoader(), daoImpl.getClass()
.getInterfaces(), daoHandler);
dao.save();
}
}
2. 5. 结果
3. 模拟Mybatis中的代理实现
3.1. MapperProxy类
package javaproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MapperProxy implements InvocationHandler {
@SuppressWarnings("unchecked")
/*
* 这里通过静态方法得到实现类的对象
*
* @param:接口
*
* @param:用sqlsession执行方法
*
* @return: 返回代理对像
*/
public static <T> T newMapperProxy(Class<T> mapperInterface,
Object sqlSession) {
ClassLoader classLoader = mapperInterface.getClassLoader();
Class<?>[] interfaces = new Class[] { mapperInterface };
MapperProxy proxy = new MapperProxy();
return (T) Proxy.newProxyInstance(classLoader, interfaces, proxy);
}
/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*
* @param:代理对象
*
* @param:方法通过方法名字找到对应的方法
*
* @param:通过方法传入对象找到对应的传递参数映射
*
* @return:返回执行后的参数对象
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 这里通过方法名字以及参数通过解析对应的mapper来执行对应的操作
System.out.println("在这里执行实际方法");
return null;
}
}
3.2. Client
package javaproxy;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Dao dao=MapperProxy.newMapperProxy(Dao.class, null);
dao.save();
}
}
3.3. 结果
以上是使用JDK * 的例子,希望对大家学习java程序设计有所帮助。


猜你喜欢
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。将解析json的性能提升到极致,是目前Java语言中最快的JSON库。F
- for循环for循环语句是支持迭代的一种通用结构,是最有效,最灵活的循环结构。for循环执行的次数是在执行前就确定的。语法格式如下:for(
- 这篇文章主要介绍了Spring JDK * 实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 最近为公司做的一个Demo里面用到了ScrollView嵌套了GridView和ListView,然而在嵌套的时候我发现GridView和L
- 一、登录认证基于过滤器链Spring Security的登录验证流程核心就是过滤器链。当一个请求到达时按照过滤器链的顺序依次进行处理,通过所
- 在学习Spring的过程中,留下一下痕迹。代理模式,其实就是让别人做同样的事情,但是别人却不仅将我的事情做了,还会把他的事情也做了,换言之,
- 前言本文主要给大家介绍了关于Kotlin委托属性与区间的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。委托属性有
- 前言:发送邮件,肯定是每个公司都会有的基本业务。很多公司都会选择把发送邮件作为一个基础服务,对外提供接口。直接调用就可发邮件了。但是我们都知
- 1.打开项目主界面,任意打开一个类文件,如MainActivity.java,不要打开布局文件的disign界面2.点击File-->
- 这篇文章主要介绍了通过实例了解spring使用构造器注入的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 一、项目简述功能包括: 前台+后台健身房管理系统,用户预订,教练选择。课程选 择,登录,后台管理等等。二、项目运行环境配置: Jdk1.8
- @ModelAttribute在父类、子类的执行顺序被 @ModelAttribute 注解的方法会在Controller每个方法执行之前都
- 工具栏:就是上面有个好多的快捷按钮的那个栏,比如撤销,上传,下载设置,扳手按钮,等等。目录栏:就是刚刚装的时候,这个会显示,但是不知道怎么关
- 本文实例讲述了Java程序中实现调用Python脚本的方法。分享给大家供大家参考,具体如下:在程序开发中,有时候需要Java程序中调用相关P
- 前言之前介绍了 Animatable 动画以及其 animateTo和 snapTo两个开启动画 api 的使用,实际上 Animatabl
- 开发过程中经常用到加载圈,特别是车机开发由于外设不同很多操作响应的等待时长经常要用到不同的加载圈。首先,直接上菊花效果图,这是我直接从项目里
- 本文为大家分享了java实现水果超市管理系统的具体代码,供大家参考,具体内容如下首先建立水果类的界面public class Fruit {
- C语言是高级语言,它的语法接近于人类的自然语言,但比自然语言严谨。计算机无法直接将C语言的代码运行,他们并不懂得什么是C语言,实际上,计算机
- 说明使用工具:brew caskbrew cask是一个用命令行管理Mac下应用的工具,提供了自动安装和卸载功能,能够自动从官网上下载并安装
- 写下来自己以后看:先是item的布局文件:里边放了一个图片和一个文本框<?xml version="1.0" en