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中的动态代理相关推荐

  1. 吃透Java中的动态代理

    动态代理在Java中是很重要的一部分,在很多框架中都会用到,如Spring中的AOP.Hadoop中的RPC等.为此在这把我对Java中的动态代理的理解分享给大家,同时写了一个模拟AOP编程的实例.( ...

  2. 使用 JAVA 中的动态代理实现数据库连接池

    数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共 ...

  3. Java中的动态代理详解

    前言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  4. java中的动态代理----自己手动实现

    代码使用了common-io,需要其jar 1 接口 Java代码   public interface Pruduct { void selling(); } 2 书籍类 Java代码   publ ...

  5. java动态代理_Java中的动态代理一

    方法newProxyInstance介绍 这篇开始学Java中的动态代理部分,刚开始,我们不去了解什么是动态代理相关的概念,除了动态代理,还有静态代理.我们学习动态代理直接从学习一个方法开始,这个方法 ...

  6. java 委托_动态代理:Java开发必学

    一句话概括:java 动态代理通过反射机制,可在不修改原代码的情况下添加新的功能,应用于多种场景,简单.实用.灵活,是 java 开发必学知识,本文将对动态代理使用进行详细介绍. 1. 引言 最近开发 ...

  7. Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...

  8. Java se之动态代理

    转载自 Java se之动态代理 jdk动态代理: jdk动态代理是 需要提供一个实现了InvocationHandler接口的处理类: 通过Proxy的newProxyInstance()方法,参数 ...

  9. Java中如何实现代理机制(JDK、CGLIB)

    代理分为两种: 1.静态代理 2.动态代理  动态代理又分为两种:jdk 实现  :Cglib 实现 3.Java中如何实现代理机制(JDK.CGLIB) JDK动态代理:代理类和目标类实现了共同的接 ...

  10. 学习spring必须java基础知识-动态代理

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...

最新文章

  1. 配置内存中OLTP文件组提高性能
  2. CAS Server(二):基于SpringBoot搭建客户端
  3. 近期在看的一段JS(谁能看出我想实现什么功能)
  4. 循环递归,相互结合,释放数据的价值
  5. css 幻灯片_如何使用HTML,CSS和JavaScript创建幻灯片
  6. react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
  7. MySQL 中日志的面试题总结
  8. C++调用PyTorch模型:LibTorch
  9. MongoDB、ElasticSearch、Redis、HBase比较
  10. 微信开发--开发模式简单配置
  11. CENTOS利用Keepalived构建双主MySQL+双机热备
  12. Nokia5230连接电脑无线上网
  13. 【VR】虚拟现实软件开发工具与技术
  14. python 数据结构包括三方面_Python数据结构:数据框
  15. 小榕重复数据清除器xp 怎么用
  16. 影响你成功最重要的两种人
  17. Matlab 音频信号处理
  18. er2100虚拟服务器,华三er2100n路由器恢复出厂设置
  19. 微信小程序引用外部文件找不到文件报错问题
  20. ArcMap常用1:地理配准(一张地图图片和gis地图的匹配)

热门文章

  1. 华为手机鸿蒙系统手机_华为推出鸿蒙系统2.0 明年华为手机将适配支持
  2. Stroke:利用人类遗传学理解缺血性卒中预后的机制
  3. 最小生成树算法(普利姆算法和克鲁斯卡尔算法)---抄自天勤数据结构高分笔记
  4. win系统安装夜神模拟器、夜神模拟器链接到HbuilderX
  5. 人脸识别功能实现的原理介绍与算法介绍
  6. C语言(静态链接库和动态链接库)
  7. 老人信息管理系统c语言,基于STM32的老人吃药提醒器——智能电子药盒设计(原理图、PCB源文件、源码、APP源码等)...
  8. 微信打开第三方app
  9. NM3000多用表校验仪
  10. 编程c 语言怎么表示倍数,C语言里怎么表示是3的倍数