JDK动态代理,动态生成代理类。

1.动态代理涉及到的类

(1) Java.lang.reflect.Proxy类,作用:动态生成代理类和对象

(2) Java.lang.reflect.InvocationHandler(处理器接口)

可以通过invoke方法实现对真实角色的代理访问,每次通过Proxy生成代理类对象时都要指定处理器对象。

package com.xvl.proxy;
/**
 * 接口:明星接口
 * @author 1
 *
 */
public interface Star {
    //面谈
    void confer();
    //订票
    void bookTicket();
    //唱歌
    void sing();
    //收尾款
    void collectMoney();
}
 1 package com.xvl.proxy;
 2 /**
 3  * 真实类:真实明星
 4  * @author 1
 5  *
 6  */
 7 public class RealStar implements Star {
 8
 9     @Override
10     public void confer() {
11         System.out.println("真实角色面谈...");
12     }
13
14     @Override
15     public void bookTicket() {
16         System.out.println("真实角色订票...");
17     }
18
19     @Override
20     public void sing() {
21         System.out.println("真实角色唱歌...");
22     }
23
24     @Override
25     public void collectMoney() {
26         System.out.println("真实角色收尾款...");
27     }
28
29 }
 1 package com.xvl.proxy;
 2
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5
 6 public class StarHandler implements InvocationHandler {
 7
 8     Star realstar;
 9
10     public StarHandler(Star realstar) {
11         this.realstar = realstar;
12     }
13
14     /**
15      * 在invoke方法中实现对真实角色的控制
16      */
17     @Override
18     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
19         System.out.println("********");
20         method.invoke(realstar, args);
21         return null;
22     }
23
24 }
 1 package com.xvl.proxy;
 2
 3 import java.lang.reflect.Proxy;
 4
 5 /**
 6  * 测试类
 7  * @author 1
 8  *
 9  */
10 public class Test {
11     public static void main(String[] args) {
12         Star star = new RealStar();
13         StarHandler starHandler = new StarHandler(star);
14         //创建代理类对象,newProxyInstance返回一个实现star接口的代理类对象
15         Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, starHandler);
16         /*
17          * 此时便可以通过代理类操作
18          */
19         proxy.bookTicket();                //代理对象调用方法会调用真实对象的方法
20         proxy.confer();                    //代理对象调用方法会调用真实对象的方法
21         proxy.sing();                      //代理对象调用方法会调用真实对象的方法
22         proxy.collectMoney();              //代理对象调用方法会调用真实对象的方法
23     }
24 }

运行结果如下:↓

********
真实角色订票...
********
真实角色面谈...
********
真实角色唱歌...
********
真实角色收尾款...

在invoke方法中实现对真实角色的控制  假如将invoke方法修改如下
 1 package com.xvl.proxy;
 2
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5
 6 public class StarHandler implements InvocationHandler {
 7
 8     Star realstar;
 9
10     public StarHandler(Star realstar) {
11         this.realstar = realstar;
12     }
13
14     /**
15      * 在invoke方法中实现对真实角色的控制
16      */
17     @Override
18     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
19         Object object = null ;
20         System.out.println("********");
21         if(method.getName().equals("sing")){
22             object = method.invoke(realstar, args);
23         }
24         return object;
25     }
26
27 }

输出结果如下:

  ********
  ********
  ********
  真实角色唱歌...
  ********

invoke方法如何被调用不太清楚,正在探索中....

本人初学,如有错误,望指正。

时间: 2024-08-28 05:34:04

JDK动态代理,动态生成代理类。的相关文章

Java中动态代理技术生成的类与原始类的区别 (转)

用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑. 平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后来定义的逻辑.这样就达到了动态的在原有类上增加一些功能.比如日志打印,拦截信息等. 这里只关心动态代理技术生成新的类,先不管虚拟机是如何去生成类,用了什么字节码生成技术,怎么产生字节码等这一系列动作.现在只关心最后生成的新类长什么样,它和老类有什么区别.为了获取到生成后的代理类的字节码并且反编译成我

深度模拟java动态代理实现机制系类之二

这次我们要实现的是对任意接口,任意的方法进行特定的代理 这里不一样的只有Proxy类,要实现对所有方法进行代理,那么重点就在于获得接口的所有方法 import java.io.File;import java.io.FileWriter;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader; import jav

深度模拟java动态代理实现机制系类之一

上一篇博客是最基本的动态代理原理的实现,因为其固定了接口,固定了代理方法,以及固定了代理的类型,接下来的博客系类将一步步渐入深度介绍java的动态代理的实现原理 ****************************************************************************首先补充一下“java代理”的相关知识,静态代理的实现包括两种方式,一是聚合,另一种是继承.聚合是指通过接口,调用其实现类的具体方法:比如接口i,含有方法run(); 类A 实现了接口i

动态代理与子类代理

1.动态代理 java.lang.reflect.Proxy 对象 帮我们生成一个代理对象来完成这个记录日志的工作 动态代理:被代理的对象一定要实现接口 loader: 类加载器,跟被代理对象(UserDao)一致即可 interfaces: 被代理对象的接口列表 h这个参数: 传入的是这个接口的实现类 动态生成的子类 1 //使用动态代理工具生成代理对象 2 public class DynamicProxyUtil { 3 /** 4 * 获取动态代理对象 5 * @param obj 目标

Spring框架中2种生成代理对象的方法

Spring框架中2种生成代理对象的方法 Jdk Proxy基于接口生成代理对象,只能赋值给接口的引用(默认使用jdk). Spring进一步封装 CGLIB,基于实现类生成代理对象,既可以赋值给接口的引用,也可以赋值给实现类的引用 JDK提供的Proxy,和spring进一步封装的CGLIB.二者生成的代理没有任何区别,生成的都是代理对象.只是生产方式不同,前者是基于接口生成代理,后者基于实现类生成代理对象 如何切换spring框架中默认生成代理的方式 <aop:config proxy-ta

深入探索spring技术内幕(六): JDK动态代理和cglib生成代理

[ JDK生成代理 ] JDK中给我们提供了一个Proxy类可以动态的给我们生成代理. 假定我们要做一个权限管理系统, 需要控制用户对某一个方法的访问. 如果user为null, 那么不让用户访问save方法. ① 接口类: PersonService public interface PersonService { public void save(); } ② 实现类: PersonServiceImpl public class PersonServiceImpl implements P

jdk动态代理与cglib代理、spring aop代理实现原理解析

原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 动态代理实现主要有2种形式,主要分为: 1.jdk动态代理: 1)原理:是根据类加载器和接口创建代理类(此代理类是接口的实现类,所以必须使用接口 面向接口生成代理,位于java.lang.reflect包下) 2)实现方式: 1. 通过实现Invocati

jdk动态代理和cglib代理总结

首先我们来谈谈jdk的动态代理,它允许开发者在运行期创建接口的代理实例,那么当我们在运行过程中调用某个实例的某个方法时,可以使用代理对象去具体实现它,从而达到aop的效果. (1)jdk的动态代理主要涉及两个类:proxy和invocacationHandler,invocationHandler里面包含了横切逻辑,并且可以使用反射调用目标类的方法(就是切点),proxy类主要是使用它的一个newinstance方法去创建一个代理实例. 下面我们来看代码: package com.yue.tes

基于Spring AOP的JDK动态代理和CGLIB代理

一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 二.主要用途 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务