- jdk和cglib的区别
jdk只能针对接口代理,cglib不要求接口。 - jdk实现方式
运行期间动态生成代理类字节码。
public class JdkProxyDemo {
interface Foo {
void foo();
void foo2();
}
static final class Target implements Foo {
public void foo() {
System.out.println("target foo");
}
@Override
public void foo2() {
System.out.println("target foo2");
}
}
// jdk 只能针对接口代理
// cglib
public static void main(String[] param) throws IOException {
// 目标对象
Target target = new Target();
ClassLoader loader = JdkProxyDemo.class.getClassLoader(); // 用来加载在运行期间动态生成的字节码
//参数一 loader:代理类的类加载器
//参数二:代理类实现的接口
//参数三 invocationHandler接口:
Foo proxy = (Foo) Proxy.newProxyInstance(loader, new Class[]{Foo.class}, new InvocationHandler() {
@Override
//proxy:代理对象
//method:正在执行的方法对象
//args:方法参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before...");
//方法.invoke(目标,参数)
Object objectResult = method.invoke(target,args);
System.out.println("after");
return objectResult;
}
});
proxy.foo();
System.out.println("------");
proxy.foo2();
}
}
- 运行结果
- 总结
(1)Proxy(代理类)和Target(目标类)实现相同的接口Foo,
代理类调用Foo.xx方法时,代理类会在inovoke方法中执行target.xx方法。实现对Foo接口所有方法的增强。
(2)Proxy和Target是兄弟关系,即使Foo接口被final修饰,代理也可以生效。而cglib实现动态代理是通过继承的方式,目标类就不能是final了。
cglib示例见cglib