jdk动态代理demo

第一次听说jdk动态代理是在spring的代理对象原理中,也知道了代理模式还可以这样实现,还有一种字节码形式实现。普通业务代码中,我们很少这样写,通常都会注入代理对象的方式实现,但是如果你仔细观察各种基础组件就会发现很多实用类似的原理。本文就jdk动态代理示例。

  • 下面是示例代码

先定义一个demoservice接口

1
2
3
4
5
6
7
package com.zw.dubbo.service;

public interface DemoService {

String sayHello(String name);

}

实现调用实现类InvocationHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.zw.dubbo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

class TestInvocationHandler implements InvocationHandler {

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// do something
System.out.println("hello, " + args[0] );
return null;
}
}

接口代理调用测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.zw.dubbo.proxy;

import com.zw.dubbo.service.DemoService;

import java.lang.reflect.Proxy;

/**
* 使用jdk的动态代理
*/
public class TestProxy {

public static void main(String[] args) {
DemoService demoService = (DemoService) Proxy.newProxyInstance(TestProxy.class.getClassLoader()
,new Class[]{DemoService.class}
,new TestInvocationHandler());
demoService.sayHello("xiao ming");
}
}

执行结果

1
hello, xiao ming

从上面的执行结果来看,虽然我们的代码调用的是demoService.sayHello方法,但是实际调用的是TestInvocationHandler.invoke方法。在平时研究代码是碰到这种定义了接口但是又找不到实现类的情况,可能就是动态代理了。