cglib实现动态代理简单使用

Boss:

package proxy.cglib;

public class Boss{
    public void findPerson() {
        System.out.println("我要找java架构师");
    }
}

WebApp:

package proxy.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 方法拦截器
 */
public class WebApp implements MethodInterceptor {

    public Object getInstance(Class clazz)throws Exception{
        Enhancer enhancer = new Enhancer();
        //告诉cglib,生成的子类需要继承哪个类
        enhancer.setSuperclass(clazz);
        //设置回调
        enhancer.setCallback(this);
        //生成源代码
        //编译成class文件
        //加载到JVM中,并返回被代理对象
        return enhancer.create();
    }

    //字节码重组
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("找Person,找我WebApp");
        System.out.println("---------------");
        //这个obj的引用是由CGLib给我们new出来的
        //cglib new出来以后的对象,是被代理对象的子类
        //在new子类之前,实际上默认先调用了我们super()方法的,
        //new子类的同时,必须先new出来父类,这就相当于是间接的持有了我们父类的引用
        //子类重写了父类的所有的方法
        //我们改变子类对象的某些属性,是可以间接的操作父类的属性的
        methodProxy.invokeSuper(o,objects);//这里是调父类的(子类死循环)
        System.out.println("---------------");
        return null;
    }
}

Test:

package proxy.cglib;

/**
 * JDK的动态代理是通过接口来进行强制转换的
 * 生成以后的代理对象,可以强制转换为接口
 *
 *CGLib的动态代理是通过生成一个被代理对象的子类,然后重写父类的方法
 * 生成以后的对象,可以强制转换为被代理对象
 * 子类引用赋值给父类
 */
public class Test {
    public static void main(String[] args){
        try {
            Boss boss = (Boss) new WebApp().getInstance(Boss.class);
            boss.findPerson();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

原文地址:https://www.cnblogs.com/fly-book/p/10361846.html

时间: 2024-10-09 01:01:06

cglib实现动态代理简单使用的相关文章

JDK动态代理和Cglib的动态代理

最简单的是静态代理方法,即代理模式,这里就不多啰嗦了.. 重点说一下JDK的动态代理和Cglib的动态代理吧 先说JDK的,需要被代理的类需要有接口,否则无法实现 package proxy.dynamic; public interface IBook { void add(); } 实现接口的类如下 package proxy.dynamic; public class Book implements IBook { @Override public void add() { System.

基于jdk和cglib的动态代理

动态代理是Spring Aop的基础,分为基于JDK的动态代理和基于CGLIB的动态代理. 声明一个被代理的类: package com.maheng.proxy.jdk; public interface IUser { public void save(String name); } package com.maheng.proxy.jdk; public class User implements IUser{ @Override public void save(String name)

好记性不如烂笔头47-java拦截器-用CGLib实现动态代理(2)

动态代理技术是整个java技术系统中非常重要的一环,它是我们能够深入学习java框架的基础,是深入了解Spring等框架时要掌握的基础知识之一. Java中自带的动态代理的类必须要实现一个接口,也就是说只能对该类所实现接口中定义的方法进行代理,这在实际编程中具有一定的局限性,而且使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高.

使用CGLIB实现动态代理

参考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments CGLIB动态代理 定义:CGLIB(code genaration libary), 代码自动生成类库. 在程序运行中自动生成扩展类和实现java接口,是一个强大的高性能的代码生成包 CGLIB动态代理的实现 1).导入cglib所需的jar包 2).实现MethodIntercetor类,实现代理类对象的具体逻辑 重写intercept()方法,在interc

Java动态代理简单应用

概念 代理模式是基本的设计模式之一,它是开发者为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象.这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色. Java动态代理比代理的思想更进一步,因为它可以动态地创建代理并动态地处理对代理方法的调用.在动态代理上所做的所有调用都会被重定向到单一的调用处理器(InvocationHandler)上,调用处理器的工作是揭示调用的类型并确定相应的策略. Java动态代理实现机制采用了反射的思想,有关于反射的基础知识,可以参见博客

JDK和CGLIB生成动态代理类的区别

 关于动态代理和静态代理 当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象. 按照代理对象的创建时期不同,可以分为两种: 静态代理:程序员事先写好代理对象类,在程序发布前就已经存在了: 动态代理:应用程序发布后,通过动态创建代理对象. 其中动态代理又可分为:JDK动态代理和CGLIB代理. 1.JDK动态代理 此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前

cglib的动态代理

前言 jdk中的动态代理通过反射类Proxy和InvocationHandler回调接口实现,要求委托类必须实现一个接口,只能对该类接口中定义的方法实现代理,这在实际编程中有一定的局限性. cglib实现 使用cglib[Code Generation Library]实现动态代理,并不要求委托类必须实现接口,底层采用asm字节码生成框架生成代理类的字节码,下面通过一个例子看看使用CGLib如何实现动态代理.1.定义业务逻辑 public class UserServiceImpl { publ

cglib 的动态代理

接着JDK 的动态代理的内容一起写的 ①目标类 public class GirlWaiter{ public void serve() { System.out.println("上菜"); }} public class Advice { public void smile() { System.out.println("微笑服务"); } public void discount() { System.out.println("打折服务")

ORM简介 && MyBatis和Hibernate的不同 && 动态代理简单实现Mybatis基本使用

ORM简介 对象关系映射. ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中. 只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中.当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal. ORM是通过使用描述对象和数据库之间映射的元数据,在我们想到描述的时候