SSM-Spring-09:Spring中jdk动态代理

释放双眼,带上耳机,听听看~!

 

 


1
2
1------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
2

 

 

JDK动态代理:

为何叫JDK动态代理呢?

所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的api

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

何为动态?相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

下面我拿例子带入,具体的动态代理案例如下:

首先按平时的方式来写,一个接口,一个实现它的类

ISomeService接口


1
2
3
4
5
6
7
8
9
1package cn.dawn.day09jdkdtproxy;
2
3/**
4 * Created by Dawn on 2018/3/8.
5 */
6public interface ISomeService {
7    public void doSome();
8}
9

 

SomeServiceImpl类,实现ISomeService接口

 


1
2
3
4
5
6
7
8
9
10
11
1package cn.dawn.day09jdkdtproxy;
2
3/**
4 * Created by Dawn on 2018/3/8.
5 */
6public class SomeServiceImpl implements ISomeService {
7    public void doSome() {
8        System.out.println("do something");
9    }
10}
11

 

测试类,用动态代理的形式,对方法进行增强操作

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1package cn.dawn.day09jdkdtproxy;
2
3import java.lang.reflect.InvocationHandler;
4import java.lang.reflect.Method;
5import java.lang.reflect.Proxy;
6
7/**
8 * Created by Dawn on 2018/3/8.
9 */
10public class Test {
11    public static void main(String[] args) {
12        /*匿名内部类要想得到外面的值,需要把外面的值改为常量*/
13        final ISomeService service=new SomeServiceImpl();
14        /*用动态代理的方式生成ISomeService的对象,就是增强后的对象,可以看看newProxyInstance的方法参数,就有方法去写了*/
15        /*InvocationHandler是由代理实例的调用处理程序实现的接口。*/
16        ISomeService proxy=(ISomeService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
17            /**
18             *invoke:每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分派给invoke 其调用处理程序的方法。
19             * @param proxy     代理对象,没啥用
20             * @param method        反射获取的方法
21             * @param args          方法的参数
22             * @return
23             * @throws Throwable
24             */
25            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
26                System.out.println("before===================");
27                method.invoke(service,args);//相当于执行目标类型的方法
28                return null;
29            }
30        });
31        proxy.doSome();
32    }
33}
34

 

值得一提的是:Proxy是java.lang.reflect包下,正因如此,才叫JDK动态代理

给TA打赏
共{{data.count}}人
人已打赏
安全技术

C++ 中 struct和class 的区别

2022-1-11 12:36:11

安全漏洞

预警Oracle WebLogic 远程代码执行漏洞(CVE-2019-2725 补丁绕过)

2019-12-29 21:22:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索