Java中的动态代理
Java中的动态代理
关于代理Proxy 常用的有三种
静态代理 jdk动态代理 (接口代理) cglib动态代理
静态代理
代理类和实现类 都实现同样的接口 然后代理类中一个属性用来保存实现类 并通过构造函数或者set方法注入实现类对象
然后调用代理类的方法
这样就能做到在调用实现类方法之前 先调用代理类的逻辑
静态代理的demo
package Proxy;
public interface Animal {
public void sayHello(String catname);
}
实现类
package Proxy;
public class Cat implements Animal{
@Override
public void sayHello(String catname) {
System.out.println("猫主子("+catname+"):$#@$%$%^&*%$%");
}
}
代理类
package Proxy;
public class CatProxy implements Animal {
private Animal cat = new Cat();
@Override
public void sayHello(String catname) {
System.out.println("铲屎官:下面有请猫主子("+catname+")发话");
cat.sayHello(catname);
System.out.println("铲屎官:猫主子("+catname+")说了,这些小鱼干都是我的");
}
public static void main(String[] args) {
//创建代理对象 调用方法
CatProxy catProxy = new CatProxy();
catProxy.sayHello("哈哈");
}
}
效果
jdk动态代理(接口代理)
为什么叫动态代理?
静态代理所有的方法都硬编码写死了 不灵活
动态代理不需要自己实现代理类 但是实现类必须实现接口
而是jdk在运行时自动生成代理类对象 传入需要增强的逻辑代码
jdk的代理类 java.lang.reflect.Proxy
jdk实现代理只需要使用newProxyInstance()方法
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
参数依次为
ClassLoader loader,: 指定当前目标对象使用类加载器,获取加载器的方法是固定的
Class<?>[] interfaces,: 目标对象实现的接口的类型,使用泛型方式确认类型
InvocationHandler h: 事件处理,使用代理对象执行目标对象的方法时,会触发事件处理器
例子
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CatProxy {
public static void main(String[] args) {
//目标对象
Animal cat = new Cat();
//生成对应的代理对象
Animal animal = (Animal) Proxy.newProxyInstance(
//类加载器
CatProxy.class.getClassLoader(),
//目标对象实现的接口
cat.getClass().getInterfaces(),
//事件处理程序
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//args表示调用方法传入的参数
String catname = (String) args[0];
System.out.println("铲屎官:下面有请猫主子("+catname+")发话");
//proxy代理对象
//System.out.println(proxy);//这样会报空指针
//因为这个对象是代理对象 是运行时期动态生成的
System.out.println(proxy.getClass());
//方法对象(反射中一样)
//返回 调用方法的结果 传入目标对象和参数
method.invoke(cat,args);
System.out.println("铲屎官:猫主子("+catname+")说了,这些小鱼干都是我的");
return null;
}
}
);
// System.out.println(animal.getClass());
//调用代理对象
animal.sayHello("嘻嘻");
}
}
但是这样
都是没问题的
CGLIB子类代理
jdk接口代理 class $Proxy implement Animal
如果被代理对象没有实现接口 如何对对象方法进行扩展呢?
可以使用子类代理 CGLIB
class $CGLIB12345 extends Cat
在内存中构建一个目标类的子类 从而实现对目标类功能的扩展
Cglib是一个高性能的代码生成包
所以需要依赖 用spring的就可以了
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.0.2.RELEASE</version></dependency>
例子
实体类
package cglib;
public class Cat{
public void sayHello(String catname) {
System.out.println("猫主子("+catname+"):$#@$%$%^&*%$%");
}
}
测试
package cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
//目标对象
Cat cat = new Cat();
//对目标类创建cglib代理对象
Cat catproxy = (Cat)Enhancer.create(
Cat.class,
new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//获取方法名
String name = method.getName();
//获取参数
String catname = (String) objects[0];
//调用方法
System.out.println("铲屎官:下面有请猫主子("+catname+")发话");
method.invoke(cat,catname);
System.out.println("铲屎官:猫主子("+catname+")说了,这些小鱼干都是我的");
return null;
}
}
);
System.out.println(catproxy.getClass());
catproxy.sayHello("哈哈");
}
}
转载于:https://www.cnblogs.com/Tamako/p/11490586.html
Java中的动态代理相关推荐
- 吃透Java中的动态代理
动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...
- 使用 JAVA 中的动态代理实现数据库连接池
数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共 ...
- Java中的动态代理详解
前言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- java中的动态代理----自己手动实现
代码使用了common-io,需要其jar 1 接口 Java代码 public interface Pruduct { void selling(); } 2 书籍类 Java代码 publ ...
- java动态代理_Java中的动态代理一
方法newProxyInstance介绍 这篇开始学Java中的动态代理部分,刚开始,我们不去了解什么是动态代理相关的概念,除了动态代理,还有静态代理.我们学习动态代理直接从学习一个方法开始,这个方法 ...
- java 委托_动态代理:Java开发必学
一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...
- Java基础:动态代理
系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...
- Java se之动态代理
转载自 Java se之动态代理 jdk动态代理: jdk动态代理是 需要提供一个实现了InvocationHandler接口的处理类: 通过Proxy的newProxyInstance()方法,参数 ...
- Java中如何实现代理机制(JDK、CGLIB)
代理分为两种: 1.静态代理 2.动态代理 动态代理又分为两种:jdk 实现 :Cglib 实现 3.Java中如何实现代理机制(JDK.CGLIB) JDK动态代理:代理类和目标类实现了共同的接 ...
- 学习spring必须java基础知识-动态代理
2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...
最新文章
- 配置内存中OLTP文件组提高性能
- CAS Server(二):基于SpringBoot搭建客户端
- 近期在看的一段JS(谁能看出我想实现什么功能)
- 循环递归,相互结合,释放数据的价值
- css 幻灯片_如何使用HTML,CSS和JavaScript创建幻灯片
- react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
- MySQL 中日志的面试题总结
- C++调用PyTorch模型:LibTorch
- MongoDB、ElasticSearch、Redis、HBase比较
- 微信开发--开发模式简单配置
- CENTOS利用Keepalived构建双主MySQL+双机热备
- Nokia5230连接电脑无线上网
- 【VR】虚拟现实软件开发工具与技术
- python 数据结构包括三方面_Python数据结构:数据框
- 小榕重复数据清除器xp 怎么用
- 影响你成功最重要的两种人
- Matlab 音频信号处理
- er2100虚拟服务器,华三er2100n路由器恢复出厂设置
- 微信小程序引用外部文件找不到文件报错问题
- ArcMap常用1:地理配准(一张地图图片和gis地图的匹配)
热门文章
- 华为手机鸿蒙系统手机_华为推出鸿蒙系统2.0 明年华为手机将适配支持
- Stroke:利用人类遗传学理解缺血性卒中预后的机制
- 最小生成树算法(普利姆算法和克鲁斯卡尔算法)---抄自天勤数据结构高分笔记
- win系统安装夜神模拟器、夜神模拟器链接到HbuilderX
- 人脸识别功能实现的原理介绍与算法介绍
- C语言(静态链接库和动态链接库)
- 老人信息管理系统c语言,基于STM32的老人吃药提醒器——智能电子药盒设计(原理图、PCB源文件、源码、APP源码等)...
- 微信打开第三方app
- NM3000多用表校验仪
- 编程c 语言怎么表示倍数,C语言里怎么表示是3的倍数