准备一个待增强的目标类,并实现接口
interface Foo {
void foo();
int bar();
}//待增强的目标类
static class Target implements Foo {
public void foo() {
System.out.println("target foo");
}
要进行功能增强的话,就只有两种选择 jdk和cglib,一个jdk自带,一个第三方。
我们用jdk代理来演示,只能针对接口代理
public static void main(String[] param) {
// 目标对象
Target target = new Target();
// 代理对象
Foo proxy = (Foo) Proxy.newProxyInstance(
Target.class.getClassLoader(), new Class[]{Foo.class},
(p, method, args) -> {
System.out.println("proxy before...");
//目标:方法(参数)
//方法.invoke(目标,参数)
Object result = method.invoke(target, args);
System.out.println("proxy after...");
return result;//让代理也返回目标方法执行的结果
});
// 调用代理
proxy.foo();
}
运行结果
proxy before...
target foo
proxy after...
收获💡
-
jdk 动态代理要求目标必须实现接口,生成的代理类实现相同接口,因此代理与目标之间是平级兄弟关系
-
目标可以是final,没有任何影响