一.
动态代理的使用:spring中的AOP(面向方面的编程)
二.
Interface InvocationHandler(调用处理器):该接口中仅定义了一个方法
public object invoke(Object obj,Method method,Object[] args)
在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例的request(),
args为该方法(被代理的方法)的参数数组。这个抽象方法在代理类中动态实现。
三.
Proxy:该类即为动态代理类。作用类似于上例中的ProxySubject,其中主要包含以下内容
1.protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值
(不能在外面new它)
2.static Class getProxyClass(ClassLoader loader,Class[] interfaces):
获取一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
3.static Object newProxyInstance(ClassLoader loader,Class[] interfaces,
InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用
(可使用被代理类的在Subject接口中声明过的方法)
四.
所谓Dynamic Proxy是这样一种class: 它是在运行时生成的class,在生成它时你必须提供一组interface给它,
然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。
当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你做实质性的工作,在生成它的实例时你必须提供一个
handler,由它接管实际的工作。
五.
在使用动态代理类时,我们必须实现InvocationHandler接口
六.
通过这种方式,被代理的对象(RealSubject)可以在运行时动态改变,需要控制的接口(Subject接口)可以在运行时改变
,控制的方法(DynamicSubject类)也可以动态改变,从而实现了非常灵活的动态代理关系。
七. 客户
代理接口
代理
接口
对象
八.
动态代理步骤:
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 动态代理实现的接口InvocationHandler
* */
public class DynamicSubject implements InvocationHandler {
private Object sub;//目标对象......真实角色
public DynamicSubject(Object obj){
this.sub=obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling:"+method);
method.invoke(sub, args);//表示真正的方法调用
System.out.println("after calling:"+method);
return null;//返回值可以是method.invoke()的返回值
}
}
2.创建被代理的接口以及类
/**
* 在java动态代理里面,抽象角色一定是一个接口
* */
public interface Subject {
public void request();
}
public class RealSubject implements Subject {
public void request() {
System.out.println("From real subject");
}
}
3.通过Proxy的静态方法newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)创建一个代理
4.通过代理调用方法
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicSubject(realSubject);
Class<?> clazz = realSubject.getClass();
/**
* 那三个参数的含义:
* 1.被代理的真实类的类装载器
* 2.真实类所拥有全部接口的数组
* 3.接管实际工作的处理器
*/
// 生成的subject其实就是代理角色
Subject subject = (Subject) Proxy.newProxyInstance(clazz
.getClassLoader(), clazz.getInterfaces(), handler);
subject.request();// 运行到这,跳入真正的业务处理......这块是重点!!!
// Proxy是所有动态代理类的父类(此生成的subject的父类是Proxy)
System.out.println(subject.getClass().getSuperclass().getName());// 动态代理类是运行的时候生成的
}
}
分享到:
相关推荐
Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...
031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java反射机制】_工厂设计模式笔记.pdf 031601_【第16章:Annotation】_系统内建Annotation笔记.pdf 031602_【第16章:Annotation】_自定义...
18. **第十八章:Java开发工具与实践** - Eclipse和IntelliJ IDEA的使用 - 版本控制工具Git - JUnit单元测试 通过学习这个教材,读者不仅可以掌握Java语言的基础知识,还能了解到实际开发中的常见技术和最佳实践...
看到那些要积分的很不酸,发布免费版本。...javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性
12. **第十二章:Java Swing图形界面编程** - Swing组件库:JFrame、JButton、JLabel、JTextArea等 - 布局管理器:FlowLayout、BorderLayout、GridLayout、BoxLayout - AWT与Swing的区别 - Event监听机制 这些...
第十篇:Spring 那点破事!IOC、AOP、生命周期、动态代理、设计模式 第十一篇:Spring Boot !starter组件、JPA、定时任务、全局异常 第十二篇:Spring Cloud !Gateway、注册发现、Hystrix、Ribbon 第十三篇:MQ ...
第18章 Hibernate的检索方式(下) 18.1 连接查询 18.1.1 默认情况下关联级别的运行时检索策略 18.1.2 迫切左外连接 18.1.3 左外连接 18.1.4 内连接 18.1.5 迫切内连接 18.1.6 隐式内连接 18.1.7 右...
深入探讨枚举、注解、反射、动态代理等Java的高级特性,为后续的进阶学习打下基础。 通过以上十个章节的学习,初学者将能够熟练地运用Java进行基本的程序设计,并具备进一步探索Java世界的能力。在实际学习过程中,...
看到很多人都分卷打包的,下载很是不方便,还浪费积分...javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性
第18章 Hibernate的检索方式(下) 18.1 连接查询 18.1.1 默认情况下关联级别的运行时检索策略 18.1.2 迫切左外连接 18.1.3 左外连接 18.1.4 内连接 18.1.5 迫切内连接 18.1.6 隐式内连接 18.1.7 右...
第18章 Hibernate的检索方式(下) 18.1 连接查询 18.1.1 默认情况下关联级别的运行时检索策略 18.1.2 迫切左外连接 18.1.3 左外连接 18.1.4 内连接 18.1.5 迫切内连接 18.1.6 隐式内连接 18.1.7 右...
第18章 Hibernate的检索方式(下) 18.1 连接查询 18.1.1 默认情况下关联级别的运行时检索策略 18.1.2 迫切左外连接 18.1.3 左外连接 18.1.4 内连接 18.1.5 迫切内连接 18.1.6 隐式内连接 18.1.7 右...
#### 第四周(11月28日—12月2日):Java开发工具与动态代理 - **学习内容**:重点介绍Java开发工具及其使用方法,如Maven等。同时还会涉及Java动态代理的概念和应用场景。 - **指导人**:王鹏宏 - **学习目标**: ...
17. **第十七章:反射与代理** - 反射允许程序在运行时检查类的信息并动态调用方法,代理则用于创建具有额外功能的动态对象。 以上就是《Thinking in Java》第四版从第二章到第十七章的主要知识点,通过这些章节的...
java高手真经 全光盘源代码 打包rar ...javareflection.zip 26.Java反射机制与动态代理 javageneric.zip 27.Java泛型编程 javaannotation.zip 28.Java注释符编程 javafeature.zip 29.Java5.0语言新特性
20. **动态代理与反射机制**:动态代理允许在运行时创建代理对象,反射机制则可以访问和修改运行时的类信息。 21. **JVM内存管理**:包括内存空间、内存分配和垃圾回收,通过工具如JConsole、JVisualVM和JMap监控和...
1. 反射:运行时动态获取类信息并操作对象,常用于插件框架和动态代理。 2. 注解:提供元数据,用于编译时或运行时处理。 十、Java虚拟机(JVM) 理解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)...
8. **高级特性**:"chapter28"可能涉及到Java的一些高级特性,如反射、注解、动态代理等。这些特性可以帮助程序员进行更灵活的编程和元数据管理。 通过这些源代码,读者不仅可以深入理解书中理论知识,还能动手实践...