JAVA JDK CGLIB 动态代理 比较
2016-07-01 10:59
435 查看
1. jdk cglib 动态代理区别
jdk的动态代理要求委托类必须实现接口才行
cglib是对委托类生成其子类,不需要委托类实现接口,但委托类不能是final的。
另个人理解 代理 同 装饰模式有点混淆
2. 示例
jdk
package com.zybros.test.service;
public interface IPeople {
public void eat(String s);
public void say(String s);
}
package com.zybros.test.service;
public class PeopleImpl implements IPeople {
@Override
public void eat(String s) {
// TODO Auto-generated method stub
System.out.println("**** eat **** "+s);
}
@Override
public void say(String s) {
// TODO Auto-generated method stub
System.out.println("**** say **** "+s);
}
}
package com.zybros.test.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class PeopleProxy implements InvocationHandler {
private Object target ;
public Object getProxy(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object p , Method method, Object[] args)
throws Throwable {
this.before();
method.invoke(target, args);
this.after();
return target;
}
private void before(){
System.out.println("**** jdk proxy before ****");
}
private void after(){
System.out.println("**** jdk proxy after ****");
}
}
package com.zybros.test.jdk;
import com.zybros.test.service.IPeople;
import com.zybros.test.service.PeopleImpl;
public class ProxyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
PeopleProxy proxy = new PeopleProxy();
IPeople p = (IPeople) proxy.getProxy(new PeopleImpl());
p.eat (" bread ");
p.say (" hello ");
}
}
输出
**** jdk proxy before ****
**** eat **** bread
**** jdk proxy after ****
**** jdk proxy before ****
**** say **** hello
**** jdk proxy after ****
cglib
因为委托类是一样的,就不在重复贴了,具体看上面 IPeople.java PeopleImpl.java
package com.zybros.test.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class PeopleProxyCglib implements MethodInterceptor {
private Object target;
public Object getProxy(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method m, Object[] arg,
MethodProxy p) throws Throwable {
this.before();
p.invokeSuper(obj, arg);
// m.invoke(target, arg);
this.after();
return null;
}
private void before(){
System.out.println("**** cglib proxy before ****");
}
private void after(){
System.out.println("**** cglib proxy after ****");
}
}
package com.zybros.test.cglib;
import com.zybros.test.service.IPeople;
import com.zybros.test.service.PeopleImpl;
public class ProxyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
PeopleProxyCglib proxy = new PeopleProxyCglib();
IPeople p = (IPeople) proxy.getProxy(new PeopleImpl());
p.eat (" bread ");
p.say (" hello ");
}
}
输出:
**** cglib proxy before ****
**** eat **** bread
**** cglib proxy after ****
**** cglib proxy before ****
**** say **** hello
**** cglib proxy after ****
注:cglib 的代理拦截intercept方法中,也可以用jdk的method实现反射,如我上面注释掉的那行。
先写到这,之后抽时间总结下,感觉比较散乱。
jdk的动态代理要求委托类必须实现接口才行
cglib是对委托类生成其子类,不需要委托类实现接口,但委托类不能是final的。
另个人理解 代理 同 装饰模式有点混淆
2. 示例
jdk
package com.zybros.test.service;
public interface IPeople {
public void eat(String s);
public void say(String s);
}
package com.zybros.test.service;
public class PeopleImpl implements IPeople {
@Override
public void eat(String s) {
// TODO Auto-generated method stub
System.out.println("**** eat **** "+s);
}
@Override
public void say(String s) {
// TODO Auto-generated method stub
System.out.println("**** say **** "+s);
}
}
package com.zybros.test.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class PeopleProxy implements InvocationHandler {
private Object target ;
public Object getProxy(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object p , Method method, Object[] args)
throws Throwable {
this.before();
method.invoke(target, args);
this.after();
return target;
}
private void before(){
System.out.println("**** jdk proxy before ****");
}
private void after(){
System.out.println("**** jdk proxy after ****");
}
}
package com.zybros.test.jdk;
import com.zybros.test.service.IPeople;
import com.zybros.test.service.PeopleImpl;
public class ProxyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
PeopleProxy proxy = new PeopleProxy();
IPeople p = (IPeople) proxy.getProxy(new PeopleImpl());
p.eat (" bread ");
p.say (" hello ");
}
}
输出
**** jdk proxy before ****
**** eat **** bread
**** jdk proxy after ****
**** jdk proxy before ****
**** say **** hello
**** jdk proxy after ****
cglib
因为委托类是一样的,就不在重复贴了,具体看上面 IPeople.java PeopleImpl.java
package com.zybros.test.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class PeopleProxyCglib implements MethodInterceptor {
private Object target;
public Object getProxy(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method m, Object[] arg,
MethodProxy p) throws Throwable {
this.before();
p.invokeSuper(obj, arg);
// m.invoke(target, arg);
this.after();
return null;
}
private void before(){
System.out.println("**** cglib proxy before ****");
}
private void after(){
System.out.println("**** cglib proxy after ****");
}
}
package com.zybros.test.cglib;
import com.zybros.test.service.IPeople;
import com.zybros.test.service.PeopleImpl;
public class ProxyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
PeopleProxyCglib proxy = new PeopleProxyCglib();
IPeople p = (IPeople) proxy.getProxy(new PeopleImpl());
p.eat (" bread ");
p.say (" hello ");
}
}
输出:
**** cglib proxy before ****
**** eat **** bread
**** cglib proxy after ****
**** cglib proxy before ****
**** say **** hello
**** cglib proxy after ****
注:cglib 的代理拦截intercept方法中,也可以用jdk的method实现反射,如我上面注释掉的那行。
先写到这,之后抽时间总结下,感觉比较散乱。
相关文章推荐
- Eclipse配置相关
- Java基本数据类型
- selenium定位方法(java实例)(二)
- Ajax SpringMvc 实现登录请求
- 介绍 Spring IoC 容器和 bean
- springMVC学习--RESTful支持
- Java基础加密之BASE64加解密
- 复习spring碰到的一些小知识
- spring boot 数据库连接池配置
- java多线程--“升级版”生产者消费者
- java调用WebService(客户端)
- springmvc学习笔记——ModelAttribute
- Spring MVC POM
- 深入浅出RxJava(一:基础篇)
- Spring的实例工厂方法和静态工厂方法
- eclipse jee中检出项目并转换为Maven project
- Java SE-运算符
- 位运算的常用操作总结
- java 反射方法收集
- JavaEE基本了解