动态代理Dynamic Proxy

  代理模式是常用的Java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类

预处理消息,过滤消息,把消息转发给委托类,以及事后处理消息等。

  代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身

并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定服务。

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。

Java反射机制可以生成任意类型的动态代理类。java.lang.reflect包中的Proxy类和invocationHandler接口提供了

生成动态代理类的能力。

InvocationHandler接口:

public interface InvocationHandler{

  public Object invoke(Object proxy,Method method, Object[] args)throws Throwable;

  //  返回值null      1.指被代理的对象2.要调用的方法3.方法调用时所需要的参数

}

Proxy类:

是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了(静态方法)如下的操作方法:

public sattic Object newProxyInstance(ClassLoader  loader,Class<?>[]  interfaces,  InvocationHandler  h)throws IllegalArgumentException

参数说明:ClassLoader  loader:类加载器

     Class<?>[]  interfaces: 得到全部的接口

     InvocationHandler  h:得到InvocationHandler接口的子类实例

类对象.getClass.getClassLoader();---获得类加载器


举例:一个吃饭的例子,我们只管吃饭,把饭前洗手,饭后刷碗的重复事情交给代理类来完成

Dinner.java-----接口

1 package Jun.Proxy;
2
3 public interface Dinner {
4     public String haveDinner();
5 }

MyDinner.java------自己的实现类-------委托类

 1 package Jun.Proxy;
 2
 3 public class MyDinner implements Dinner{
 4
 5     @Override
 6     public String haveDinner() {
 7         System.out.println("妈妈做的饭真好吃。。。。。");
 8         return "真得好吃====";
 9     }
10
11 }

MyDinnerProxy.java--------代理类

功能就是,给它一个委托类对象,会返回一个代理类对象,使用的是Proxy类的方法

Proxy.newProxyInstance----得到代理类对象(实例)

 1 package Jun.Proxy;
 2
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Proxy;
 6
 7 public class MyDinnerProxy implements InvocationHandler{
 8
 9     private Object originalObject;//被代理的原始对象
10
11     //绑定原始对象,返回一个代理对象
12     public Object bind(Object obj) {
13         this.originalObject=obj;
14         //里面的参数1:类加载器2:得到全部的接口3:得到InvocationHandler接口的实例---当前对象本身实现的这个接口
15         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
16     }
17
18     //吃饭之前要执行的方法
19     private void preMethod() {
20         System.out.println("吃饭之前要洗手。。。");
21     }
22     //吃饭之后要执行的方法
23     private void afterMethod() {
24         System.out.println("吃饭之后要刷碗。。。。");
25     }
26     @Override
27     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
28         preMethod();
29         Object result=method.invoke(this.originalObject, args);
30         afterMethod();
31         //invoke方法返回一个对象
32         System.out.println("hahahahahhaha----"+result);
33         return result;
34     }
35 }

MyDinnerProxyDemo.java-----测试

 1 package Jun.Proxy;
 2
 3 public class MyDinnerProxyDemo {
 4
 5     public static void main(String[] args) {
 6         Dinner din=new MyDinner();
 7 //        din.haveDinner();
 8         //代理类的实列
 9         MyDinnerProxy pro=new MyDinnerProxy();
10         //返回了一个代理对象
11         din=(Dinner) pro.bind(din);
12         String str=din.haveDinner();
13         System.out.println("----------------------");
14         System.out.println(str);
15     }
16 }

原文地址:https://www.cnblogs.com/xjs1874704478/p/10720269.html

时间: 2024-10-19 03:52:39

动态代理Dynamic Proxy的相关文章

Java 动态代理(proxy、invocationHandler)

首先要明白其中的概念: **Handler: 处理者.处理业务逻辑等事情. **Proxy:代理者.交给我来代理,我帮你管理事情,我出面去做本该你做的事情!我是抛头露面的侍者. /*原接口,即将被委托给代理者*/ public interface MyInterface { public void execute(); } /*原接口实现*/ public class MyInterfaceImpl implements MyInterface { @Override public void e

java动态代理实现Proxy和InvocationHandler

概念: 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建而成. JDK的动态代理用起来非常简单,当它有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包. JDK动态代理实现 import java.lang.reflect.Constructor; import java.lang.reflect.Invoc

Java中的动态代理以及Proxy类的偷瞄

动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包下,主要涉及到两个类. (1)接口InvocationHandler:该接口中仅定义了一个方法. Object invoke(Object obj, Method method, Object[] args); 在实际使用时,第一个参数obj一般指代理类,method是被代理的方法,args为该方法

Java 动态代理 调用Proxy.newProxyInstance()

一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler,单纯的jre没有compiler,会空指针错误 JavaCompiler jc = ToolProvider.getSystemJavaCompiler(); (2)//文件管事器 StandardJavaFileManager fileMgr = jc.getStandardFileManager

java 动态代理学习(Proxy,InvocationHandler)

前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里有什么用?于是网上到处搜刮,把自己的理解写了写. /** * 相亲接口 * * @author zhengt * @time Jun 3, 2095 3:13:03 PM */ public interface XiangQinInterface { /** * 相亲方法 */ public voi

简单实现动态代理(Proxy)

最近学习了Jdk的动态代理,然后自己也简单的手写了一个. 思路: 1.根据代理的接口,生成对应的Java代码文件 2.将生成的Java文件编译成class文件 3.利用URLClassLoader加载class到Jvm中,利用反射在new出这个对象. 代理业务接口 package com.michael.pl; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public i

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

常用设计模式之代理(动态代理)

常用设计模式之代理(动态代理) UML Code1 1 interface Subject{void doSth();} 2 class RealSubject implements Subject{ 3 public void doSth(){ 4 System.out.println("RealSubject doSth...."); 5 } 6 } 7 class ProxyHandler implements InvocationHandler 8 { 9 private Ob

基于Dynamic Proxy技术的方法AOP拦截器开发

在面向对象编程中,会用到大量的类,并且会多次调用类中的方法.有时可能需要对这些方法的调用进行一些控制.如在权限管理中,一些用户没有执行某些方法的权限.又如在日志系统中,在某个方法执行完后,将其执行的结果记录在日志中.处理这些需求的一般做法是在调用这些方法的地方加上适当的代码.如以下C#代码如示: 1 public class Class1 2 { 3 public void MyMethod() 4 { 5 ... 6 } 7 static void Main() 8 { 9 Class1 c1