重学JAVA基础(三):动态代理
1.接口
public interface Hello {
    public void sayHello();
}
2.实例类
public class Hello2 {
    public void sayHello() {
        System.out.println("hello world2!");
    }
}
public class Hello3 extends Hello2{
}
public class HelloImpl implements Hello{
    @Override
    public void sayHello() {
        System.out.println("hello world!");
    }
}
3.JDK动态代理
ublic class JdkTest implements InvocationHandler{
    private Object object;
    @SuppressWarnings("unchecked")
    public <T> T bind(Object obj){
        this.object = obj;
        return (T)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("before sayHello");
        method.invoke(object, null);
        System.out.println("after sayHello");
        return null;
    }
    public static void main(String[] args) {
        JdkTest test = new JdkTest();
        Hello hello = test.bind(new HelloImpl());
        hello.sayHello();
    }
}
4.cglib动态代理
public class CglibTest implements MethodInterceptor{
    private Object obj;
    /**
     * 普通接口类代理
     * @author tomsnail
     * @date 2015年4月2日 上午10:36:10
     */
    public <T> T instance(T obj){
        this.obj = obj;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.obj.getClass());
        enhancer.setCallback(this);
        return (T)enhancer.create();
    }
    @Override
    public Object intercept(Object arg0, Method arg1, Object[] arg2,
            MethodProxy arg3) throws Throwable {
        System.out.println("before sayHello");
        arg3.invoke(obj, arg2);
        System.out.println("after sayHello");
        return null;
    }
    /**
     * 无接口类代理
     * @author tomsnail
     * @date 2015年4月2日 上午10:35:58
     */
    public <T> T instanceObject(T obj){
        T t = (T)Enhancer.create(obj.getClass(),new MethodInterceptor(){
            @Override
            public Object intercept(Object arg0, Method arg1, Object[] arg2,
                    MethodProxy arg3) throws Throwable {
                System.out.println("hello2 proxy");
                return arg3.invokeSuper(arg0, arg2);
            }
        });
        return t;
    }
    /**
     * 无接口类代理
     * @author tomsnail
     * @date 2015年4月2日 上午10:35:58
     */
    public <T> T instanceSuperObject(T obj){
        T t = (T)Enhancer.create(obj.getClass(),NoOp.INSTANCE);//无任何代理时,调用父类方法实现
        return t;
    }
    public static void main(String[] args) {
        CglibTest test = new CglibTest();
        Hello hello = test.instance(new HelloImpl());
        hello.sayHello();
        Hello2 hello2 = test.instanceObject(new Hello2());//无接口类的动态代理
        hello2.sayHello();
        Hello2 hello3 = test.instanceSuperObject(new Hello3());//子类没有重写父类方法的动态代理
        hello3.sayHello();
    }
}
5.小小总结一下
JDK的动态代理只能通过接口进行处理,如果没有接口的,会很难处理。cglib没有这一限制。
还有就是性能,我看见一篇网上已经有了对比,在jdk7/8与cglib相比,反而jdk的性能很好,见http://www.cnblogs.com/haiq/p/4304615.html
重学JAVA基础(三):动态代理的更多相关文章
- 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」
		作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ... 
- Java基础-JDK动态代理
		JDK的动态代理依靠接口实现 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代 ... 
- Java基础-CGLIB动态代理
		JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继 ... 
- Java基础加强——动态代理
		代理模式: 为其他对象提供一种代理以控制对这个对象的访问. 代理模式主要分为两类: 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. ... 
- Java基础-jdk动态代理与cglib动态代理区别
		JDK动态代理 此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑. 代理模式在实际使用时需要指定具体的目标对象 ... 
- 重学JAVA基础(八):锁的基本知识
		1.线程状态 如上图,当我们新建一个线程,并start后,其实不一定会马上执行,因为只有操作系统调度了我们的线程,才能真正进行执行,而操作系统也随时可以运行其他线程,这时线程又回到可运行状态.这个过程 ... 
- 重学JAVA基础(二):Java反射
		看一下百度的解释: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息 ... 
- 重学JAVA基础(五):面向对象
		1.封装 import java.util.Date; public class Human { protected String name; protected BirthDay birthDay; ... 
- 重学JAVA基础(一):PATH和CLASSPATH
		我想大多数Java初学者都会遇到的问题,那就是怎么配置环境,执行java -jar xxx.jar 都会报NoClassDefFindError,我在最开始学习的时候,也遇到了这些问题. 1.PAT ... 
随机推荐
- c# emit 实现类的代理
			using System; using System.Linq; using System.Reflection; using System.Reflection.Emit; namespace Em ... 
- jQuery Validate(二)
			刚刚试了所谓的新版的用法.千万别问我是多新,因为我也不知道... <!DOCTYPE html> <html> <head> <script src=&quo ... 
- PLSQL怎样导出oracle表结构
			tools->export tables 是导出表结构还有数据 tools->export user objects是导出表结构 可以用tools->export tables ... 
- IPv4(四)子网和子网掩码
			为了完成路由选择,每个数据链路(网络)都必须有一个惟一的地址: 另外,数据链路上的每台主机也必须有一个地址,这个地址不仅标识主机为一个网络成员,还可以把主机与网络上的其他主机区分开来. 粗放使用IPv ... 
- 九度OJ 1161:Repeater(复制器) (递归)
			时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1449 解决:508 题目描述: Harmony is indispensible in our daily life and no one ... 
- 九度OJ 1009:二叉搜索树 (二叉树)
			时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6321 解决:2767 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需 ... 
- Swift 学习笔记(面向协议编程)
			在Swift中协议不仅可以定义方法和属性,而且协议是可以扩展的,最关键的是,在协议的扩展中可以添加一些方法的默认实现,就是在协议的方法中可以实现一些逻辑,由于这个特性,Swift是可以面向协议进行编程 ... 
- 【题解】AT2043 AND Grid
			[题解]AT2043 AND Grid 我们考虑直接构造两个互补的图切分别联通的图,然后原图有的大家都有就构造完成了. #include<iostream> #include<cst ... 
- Java中Iterator的fast-fail分析
			1.fail-fast简介 fail-fast机制是java集合(Collection)中的一个错误机制.当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件. 例如:当某一个线 ... 
- (转)三层和mvc
			先说下两者出现的目的:三层是一种为了Project间解除耦合所提出来的简单的分层方式但MVC其实并不是基于Project的分层方式,而是一种解除展示模板与主要访问控制依赖的设计模式(其实全部都是基于U ... 
