java动态代理的原理
在许多mvc框架中,经常用到注解来实现面向切面(aop)的编程。面向切面编程,可以对业务逻辑中各部分进行分离,提高程序的重用性,降低各逻辑业务部分的耦合度。
jdk中利用反射原理使用Proxy类对对象进行代理。
jdk动态代理的应用前提是,目标类基于统一的接口。
接口类:
public interface Service {
public void doService();
}
继承Service的实现类:
public class ServiceImpl1 implements Service {
@Override
public void doService() {
System.out.println("impl 1 do the service...."); }
}
public class ServiceImpl2 implements Service {
@Override
public void doService() {
System.out.println("impl 2 do the service...");
}
}
代理工厂类的getService方法,传入参数是被代理的service的class。创建InvocationHandler类对象,对被代理对象的方法进行处理。
public <T extends Service> T getService(Class<T> clazz) {
String simpleName = clazz.getSimpleName();
String implName = getImplName(simpleName);
try {
final T service = (T) Class.forName(implName).newInstance();
T froxyService = (T) Proxy.newProxyInstance(service.getClass().getClassLoader(),
service.getClass().getInterfaces(), new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("do something before proxy method...");
Object obj = method.invoke(service, args);
System.out.println("do something after proxy method...");
return obj;
}
});
return froxyService;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
}
}
测试类和结果:
public class ProxyTest {
public static void main(String[] args) {
Factory factory = new Factory();
Service impl1 = new ServiceImpl1();
Service proxyImpl1 = factory.getService(impl1.getClass());
proxyImpl1.doService();
Service impl2 = new ServiceImpl2();
Service proxyImpl2 = factory.getService(impl2.getClass());
proxyImpl2.doService();
}
} 结果是:
do something before proxy method...
impl 1 do the service....
do something after proxy method...
do something before proxy method...
impl 2 do the service...
do something after proxy method...
java动态代理的原理的更多相关文章
- java高级---->Java动态代理的原理
Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...
- 用大白话讲Java动态代理的原理
动态代理是什么 首先说下代理模式,代理模式是常见的一种java设计模式,特征是代理类与委托类实现了同样的接口,代理类主要负责为委托类预处理.过滤.转发,以及事后处理等.代理类与委托类之间通常会存在关联 ...
- java动态代理原理
我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...
- Java动态代理简单应用
概念 代理模式是基本的设计模式之一,它是开发者为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象.这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色. Java动态代理比 ...
- 深入浅出Java动态代理
文章首发于[博客园-陈树义],点击跳转到原文深入浅出Java动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理 ...
- Java动态代理 深度详解
代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...
- Java动态代理:一个面包店的动态代理帝国
文章首发于[博客园-陈树义],点击跳转到原文大白话说Java动态代理:一个面包店的动态代理帝国 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中, ...
- java动态代理——代理方法的假设和验证及Proxy源码分析五
前文地址 https://www.cnblogs.com/tera/p/13419025.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- Java动态代理——框架中的应用场景和基本原理
前言 之前已经用了5篇文章完整解释了java动态代理的原理,本文将会为这个系列补上最后一块拼图,展示java动态代理的使用方式和应用场景 主要分为以下4个部分 1.为什么要使用java动态代理 2.如 ...
随机推荐
- mysql联合查询sql优化
我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...
- Hive if和coalesce函数
链接:https://blog.csdn.net/qq_26442553/article/details/79465417 if 函数举例:
- Html5 学习笔记 【PC固定布局】 实战2 导航栏搜索区域
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...
- C++标准库的初探
1,操作符 << 的原生意义是按位左移,例: 1 << 2; 其底层的意义是将整数 1 按位左移 2 位,即: 0000 0001 ==> 0000 0100: 2,重 ...
- Codesforces 467E Alex and Complicated Task
E. Alex and Complicated Task time limit per test 2 seconds memory limit per test 256 megabytes input ...
- Qt 在相同的线程中可以在信号中传递未注册的元对象,在非相同线程中则不能传递未测试的对象,为什么呢?
有兄台知道可以在留言告诉我,万分感谢!!! 需求:需要在多线程中传递未注册的非元对象数据,时间紧急,无法及时更改该传递的数据为元对象,非继承 QObject 这里采用指针方式传递,同时把传递的局部变量 ...
- 【转】Ubuntu下外放有声音 耳机没声音
真是使用linux每天都有新的发现啊,今天早上起来用电脑,想听几首歌,插上耳机后发现没声音,我还以为是耳机坏了,就把耳机插在了手机上,发现耳机有声音,很纳闷,我象是不是电脑接口有问题了,但是在进系统的 ...
- CentOS使用手册(三)
前言: 目录:暂时不写,因为有些实验,比如负载均衡,反向代理,配置ssl等实验来不及做.所以这篇随笔还需日后补充(排版以后慢慢调,现在该做平台分析系统了) Linux中Mongodb4.x安装调试.远 ...
- 试试监听输入框的值 (eq:在未输入前,按钮为灰色,输入内容后,按钮变蓝色)
参考网址:https://blog.csdn.net/tel13259437538/article/details/78927071
- C中printf函数的用法总结
函数语法 stdio.h文件中的定义: /* Write formatted output to stdout. */ int printf (const char *__restrict __for ...