详解java动态代理模式_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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java动态代理
java代理模式
java动态代理详解、java动态代理机制详解、java 代理模式详解、动态代理模式 java、java动态代理设计模式,以便于您获取更多的相关知识。

时间: 2024-08-03 00:02:31

详解java动态代理模式_java的相关文章

详解Java动态代理的实现机制_java

一.概述 代理是一种设计模式,其目的是为其他对象提供一个代理以控制对某个对象的访问,代理类负责为委托类预处理消息,过滤消息并转发消息以及进行消息被委托类执行后的后续处理.为了保持行为的一致性,代理类和委托类通常会实现相同的接口. 按照代理的创建时期,代理类可分为两种: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译,也就是说在程序运行前代理类的.class文件就已经存在.动态代理:在程序运行时运用反射机制动态创建生成. 下面在将动态代理的实现机制之前先简单介绍一下静态代理. 二.

详解java动态代理的2种实现方式_java

java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下: 接口: public interface Num { void show(); int getNum(); int getProduct(int x); } 实现类: public class MyNum implements Num { @Override public int getNum(

图文详解java内存回收机制_java

在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正因为内存管理完全由JVM负责,所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存.因此就有了Java程序员到最后应该去了解JVM,才能写出更高效,充分利用有限的内存的程序.  1.Java在内存中的状态  首先我们先写一个代码为例子: Person.java package tes

精解Java中代理模式的实现

简介摘要: 代理模式是GOF设计模式中的一种,常用于权限模块的架构设计,其根本的原理是通过将一个代理对象交给调用者,使得调用者不能直接使用相应的功能模块,所 有的调用被传递给代理对象,代理对象负责对真实模块完成调用,在调用者与被调用者之间建立了一个隔离带,我们可以使 代理模式是GOF设计模式中的一种,常用于权限模块的架构设计,其根本的原理是通过将一个代理对象交给调用者,使得调用者不能直接使用相应的功能模块,所有的调用被传递给代理对象,代理对象负责对真实模块完成调用,在调用者与被调用者[bei t

详解Java中native关键字_java

 一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C.这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数.    "A native method is a Java method whose implementatio

详解Java的回调机制_java

模块之间总是存在这一定的接口,从调用方式上看,可以分为三类:同步调用.回调和异步调用.下面着重详解回调机制. 1. 概述 Java 中的回调机制是一个比较常见的机制,只是有可能在你的程序中使用得比较少,在一些大型的框架中回调机制随处可见.本文就通过一些具体的实例,慢慢走近 Java 的回调机制. 2.回调 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法.实际在使用的时候,也会有不同的回调形式,比如下面的这几种. 2.1 同步回调 这里我假设

【Redis缓存机制】详解Java连接Redis_Jedis_事务_java

Jedis事务 我们使用JDBC连接Mysql的时候,每次执行sql语句之前,都需要开启事务:在MyBatis中,也需要使用openSession()来获取session事务对象,来进行sql执行.查询等操作.当我们对数据库的操作结束的时候,是事务对象负责关闭数据库连接. 事务对象用于管理.执行各种数据库操作的动作.它能够开启和关闭数据库连接,执行sql语句,回滚错误的操作. 我们的Redis也有事务管理对象,其位于redis.clients.jedis.Transaction下. Jedis事

基于接口实现java动态代理示例_java

Subject.java 复制代码 代码如下: package _20140416_; import java.util.List; public interface Subject {   public String say(String name,int age);   public List<Person> getAllList(String name);} RealSubject.java 复制代码 代码如下: package _20140416_; import java.util.

轻松掌握Java代理模式_java

和大家一起聊一聊java代理模式 1.静态代理 1.1静态代理的代理类和和被代理的类都要维护一个共同的接口.  public interface IUserDao { void save(); } 1.2被代理的类,目标对象  public class UserDao implements IUserDao{ @Override public void save() { System.out.println("-----已经保存数据!!!------"); } } 1.3代理对象  p