当前位置:首页 > CN2资讯 > 正文内容

动态代理详解

3天前CN2资讯


1,jdk动态代理
jdk动态代理,需要有顶层接口才能实现,mybatis的mapper文件,使用了动态生成字节码技术

package org.lht.boot.lang.proxy;

public interface IStudentService {

/**
* 交学费
*/
void pay();

/**
* 上课
*/
void attendClass();
}package org.lht.boot.lang.proxy;

public class StudentServiceImpl implements IStudentService {


@Override
public void pay() {
System.out.println("交学费");
}

@Override
public void attendClass() {
//先交学费
pay();

System.out.println("开始上学");
}
}

创建代理类:

package org.lht.boot.lang.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class StudentAdvice implements InvocationHandler {


private IStudentService target;

public StudentAdvice(IStudentService target) {
this.target = target;
}

/**
* 代理方法, 每次调用目标方法时都会进到这里
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
return method.invoke(target, args);
}

/**
* 前置增强
*/
private void before() {
System.out.println("对学生身份进行验证.");
}
}@Test
public void test03() {
//创建目标对象
IStudentService target = new StudentServiceImpl();
//创建代理对象
IStudentService proxy = (IStudentService) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),//代理对象
new StudentAdvice(target)//做什么事情
);
//只能代理对象
proxy.attendClass();
}

运行结果:

对学生身份进行验证.
交学费
开始上学

cglib动态代理

cglib动态代理,可以实现没有接口的类,使用了动态生成字节码技术,不能对final类继承

package org.lht.boot.lang.proxy;

/**
* @author LiHaitao
* @description
* @date 2020/8/17 14:06
**/
public class StudentMethodInterceptorService {


public void pay() {
System.out.println("交学费");
}
}package org.lht.boot.lang.proxy;

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
* @author LiHaitao
* @description
* @date 2020/8/17 14:04
**/
public class DemoMethodInterceptor implements MethodInterceptor {

@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
before();
return methodProxy.invokeSuper(o, args);
}


/**
* 前置增强
*/
private void before() {
System.out.println("对学生身份进行验证.");
}
}@Test
public void test02() {

StudentMethodInterceptorService studentMethodInterceptorService = new StudentMethodInterceptorService();
StudentMethodInterceptorService proxy = (StudentMethodInterceptorService) Enhancer.create(studentMethodInterceptorService.getClass(),
new DemoMethodInterceptor());
proxy.pay();
}

运行结果:

对学生身份进行验证.
交学费

spring中:

/**
* 当Bean实现接口时,Spring就会用JDK的动态代理
* 当Bean没有实现接口时,Spring使用CGLib来实现
* 可以强制使用CGLib(在Spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)
* <p>
* <p>
* 使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,在JDK1.6之前比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。
* 在JDK1.6、JDK1.7、JDK1.8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLib代理效率,只有当进行大量调用的时候,JDK1.6和JDK1.7比CGLib代理效率低一点,但是到JDK1.8的时候,JDK代理效率高于CGLib代理
*/

问题1:如何代理一个final并且没有实现接口的类?
* 我直接把一个代理类的源代码用字符串拼出来,然后基于这个字符串调用JDK的Compiler(编译期)API,动态的创建一个新的.java文件,然后动态编译这个.java文件,这样也能得到一个新的代理类。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24616.html

    分享给朋友:

    “动态代理详解” 的相关文章

    inet.ws纽约:高性能VPS服务与折扣优惠码解析

    inet.ws是一家新兴的互联网服务提供商,成立于2020年。尽管公司年轻,但它凭借创新的VPS服务迅速在市场上占据了一席之地。最让人称道的是,inet.ws致力于为用户提供稳定和高效的云服务器体验,尤其是在他们的纽约数据中心,这里被认为是其最重要的运营点之一。 在发展的过程中,inet.ws不断完...

    搬瓦工VPS与CN2线路解析:提升网络稳定性与性价比

    搬瓦工(BandwagonHost)是一家值得关注的国外VPS主机服务商,因其性价比高、性能优异而在用户中口耳相传。最初我对搬瓦工的了解并不多,但随着对VPS服务需求的增加,自然也对市场上比较有名的服务商产生了浓厚的兴趣。在我研究的过程中,搬瓦工的特点确实吸引了我的眼球,尤其适合需要稳定网络和较高性...

    ROG主机性能评测与游戏体验分析

    ROG(Republic of Gamers)是华硕旗下专注于游戏硬件及相关产品的品牌。这个名称已经成为游戏玩家心目中的一种象征。ROG致力于为玩家提供顶尖的性能和卓越的用户体验,涵盖了从游戏主机到显示器、耳机等全系列的产品。ROG的产品不仅在技术上不断创新,还在设计上追求独特,吸引了众多游戏爱好者...

    CTM VPS:灵活部署与高效管理的理想选择

    1.1 定义与特点 说到CTM VPS,首先要了解这个名词的含义。CTM代表的是“Cloud Terminal Management”,这种虚拟私有服务器为用户提供了一个灵活、可扩展的环境,让他们能够根据需要快速部署和管理应用程序。CTM VPS的一个明显特点就是高效性。它能够在一个物理服务器上虚拟...

    Kamatera 云服务的优势:灵活的按小时计费模式

    在当今快速发展的科技环境中,云计算已成为许多企业和个人用户的首选解决方案。说到云服务,Kamatera 无疑是一个值得关注的名字。在这段介绍中,我想和大家分享一下 Kamatera 的主要特点,以及它所提供的各种服务。 首先,Kamatera 是一家全球化的云服务提供商,成立于 1995 年。他们以...

    如何选择合适的永久云盘服务:功能、价格与用户体验分析

    我时常会想,生活中有多少资料是我们需要长期保存的。无论是珍贵的照片,还是重要的工作文档,永久云盘的出现无疑让我们的数据存储变得更加安全和可靠。那么,什么是永久云盘呢?简单来说,永久云盘是一种云存储服务,它允许用户将文件上传至云端,并承诺这些文件将在很长一段时间内保持可用。这意味着你再也不必担心电脑崩...