面试造火箭系列,栽在了cglib和jdk动态代理

MATLAB实战:四桥臂逆变器3D-SVPWM调制算法仿真全流程(附代码) 本文提供了一份完整的MATLAB/Simulink实战指南,详细解析了四桥臂逆变器的3D-SVPWM调制算法仿真全流程。文章从工程实践出发,手把手指导如何搭建模型,涵盖从abc静止坐标系变换、三维空间矢量区域判定、作用时间计算到PWM信号生成与调试等核心环节,并附有代码示例和常见问题解决方案,旨在帮助工程师快速掌握这一应对不平衡负载的高效调制技术。 阅读详情

代理模式

关于代理模式,查阅比较专业的资料是这么定义的:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

上述概念看起来比较模糊,举些日常的例子,比方说火车票是个目标对象,咱们要去买,那么我们不一定非得去火车站才能买到,其实在很多代理点也能买到。再比如猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。

静态代理模式

代码演示: 下面咱们通过买火车票的案例演示一下代理模式,具体代码如下: 抽象接口:

/**
 * @Author: 老猫
 * @Description: 票
 */
public interface Ticket {
    void getTicket();
}
复制代码

火车站实现抽象接口具备买票功能

/**
 * @Author: 老猫
 * @Description: 火车站
 */
public class RailwayStation implements Ticket {

    @Override
    public void getTicket() {
        System.out.println("买了张火车票");
    }
}
复制代码

火车站代理类实现抽象接口具备买票功能

/**
 * @Author: 老猫
 * @Description: 代理类
 * @Date: 2021/12/22 5:35 下午
 */
public class RailwayAgencyProxy implements Ticket{
    private RailwayStation railwayStation;

    public RailwayAgencyProxy(RailwayStation railwayStation) {
        this.railwayStation = railwayStation;
    }

    @Override
    public void getTicket() {
        railwayStation.getTicket();
    }
}
复制代码

上述其实就是静态代理模式。

优点:

  1. 可以做到在符合开闭原则的情况下对目标对象进行功能扩展。
  2. 职责非常清晰,一目了然。

缺点:

  1. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
  2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
  3. 代码层面来看,如果接口发生改变,代理类也会发生变更。

动态代理

有了上面的基础,咱们正式聊聊动态代理。 上面的例子其实我们不难发现,每个代理类只能够实现一个接口服务。那么如果当我们的软件工程中出现多个适用代理模式的业务类型时那么咱们就会创建多个代理类,那么我们如何去解决这个问题呢?其实我们的动态代理就应运而生了。

很显然动态代理类的字节码在程序运行时由Java反射机制动态生成,无需我们手工编写它的源代码。 那咱们基于上述的案例来先看看JDK动态代理类

JDK动态代理

直接看一下JDK动态代理的使用,如下代码块

public class JDKDynamicProxy implements InvocationHandler {

    //被代理的对象
    private Object object;

    public JDKDynamicProxy(Object object) {
        this.object = object;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(object,args);
        return result;
    }

    //生成代理类
    public Object createProxyObj(){
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
    }
}
复制代码

静态代理,动态代理调用如下:

public class TestProxy {
    public static void main(String[] args) {
        //静态代理测试
        RailwayStation railwayStation = new RailwayStation();
        railwayStation.getTicket();

        RailwayAgencyProxy railwayAgencyProxy = new RailwayAgencyProxy(railwayStation);
        railwayAgencyProxy.getTicket();

        //动态代理测试
        Ticket ticket = new RailwayStation();
        JDKDynamicProxy jdkDynamicProxy = new JDKDynamicProxy(ticket);
        Ticket proxyBuyTicket = (Ticket) jdkDynamicProxy.createProxyObj();
        proxyBuyTicket.getTicket();
    }
}
复制代码

观察上面动态代理以及静态代理测试,动态代理的优势就显而易见了。如果我们再演示另外猪八戒和高翠兰代理场景的时候,是不是就不用再去创建GaocuiLanProxy了,我们只需要通过JDKDynamicProxy的方式去创建代理类即可。

注意Proxy.newProxyInstance()方法接受三个参数:

  1. ClassLoader loader:指定当前目标对象使用的类加载器,获取加载器的方法是固定的。
  2. Class<?>[] interfaces:指定目标对象实现的接口的类型,使用泛型方式确认类型
  3. InvocationHandler:指定动态处理器,执行目标对象的方法时,会触发事件处理器的方法

通过上面的例子以及上述参数,我们不难发现JDK动态代理有这样一个特性: JDK动态代理是面向接口的代理模式,如果要用JDK代理的话,首先得有个接口,例如上面例子中的Ticket接口

cglib动态代理

咱们再来看一下cglib动态代理。先了解一下cglib是什么。关于cglib,其实其官方解释是比较少的,但是其本身是十分强大的,这也是很多人所诟病的。CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。CGLIB是一个强大的高性能的代码生成包。它广泛的被许多AOP的框架使用,例如Spring AOP为他们提供方法的interception(拦截)。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。除了CGLIB包,脚本语言例如Groovy和BeanShell,也是使用ASM来生成java的字节码。当然不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

接下来我们看一下用法,由于cglib并不是jdk自带的,所以如果是maven项目的话,咱们首先需要的是引入cglib相关的pom依赖,如下:

<dependency>    
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>
复制代码

由于cglib代理的对象是类,这个是和JDK动态代理不一样的地方,这个地方标红加重点。 这样的话,咱们同样的代理类的话则应该如下定义,

public class Ticket {
    public void getTicket(){   
        System.out.println("买了张火车票");  
    }   
    
     final public void refundTicket(){  
        System.out.println("退了张火车票"); 
      }
 }
复制代码

显然,上面的类定义了两个方法,一个是买火车票另外的话退火车票。

public class CglibDynamicProxy implements MethodInterceptor {    
        
    /**
     * @param o cglib生成的代理对象
     * @param method 被代理对象的方法
     * @param objects 传入方法的参数
     * @param methodProxy 代理的方法
     * @return
     * @throws Throwable
     */   
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("execute pre");
            Object obj = methodProxy.invokeSuper(o,objects);
            System.out.println("execute after");
             return obj;
    }
}
复制代码

调用测试入口方法调用

public class TestCglibProxy {
    public static void main(String[] args) {
        // 代理类class文件存入本地磁盘方便我们反编译查看源码
   System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "/Users/kdaddy/project/log");
        // 通过CGLIB动态代理获取代理对象的过程
        Enhancer enhancer = new Enhancer();
        // 设置enhancer对象的父类
        enhancer.setSuperclass(Ticket.class);
        // 设置enhancer的回调对象
        enhancer.setCallback(new CglibDynamicProxy());
        // 创建代理对象
        Ticket ticket = (Ticket) enhancer.create();
        // 通过代理对象调用目标方法
        ticket.getTicket();
        // 通过代理尝试调用final对象调用目标方法
        ticket.refundTicket();
    }
}
复制代码

运行之后我们得到的结果如下:

execute pre
买了张火车票
execute after
取消了张火车票
复制代码

根据日志的打印情况,我们很容易发现相关打印“取消了张火车票”并没有被代理,所以我们由此可以得到一个结论cglib动态代理无法代理被final修饰的方法。

上述源码中,我们提及将代理类class写到了相关的磁盘中,打开对应的目录,我们会发现下面三个文件

源码文件

TicketEnhancerByCGLIBEnhancerByCGLIB4e79a04a类为cglib生成的代理类,该类即成了Ticket。 咱们来慢慢看看相关的源码:

public class Ticket$$EnhancerByCGLIB$$4e79a04a extends Ticket implements Factory {
    private boolean CGLIB$BOUND;
    public static Object CGLIB$FACTORY_DATA;
    private static final ThreadLocal CGLIB$THREAD_CALLBACKS;
    private static final Callback[] CGLIB$STATIC_CALLBACKS;
    //拦截器
    private MethodInterceptor CGLIB$CALLBACK_0; 
    private static Object CGLIB$CALLBACK_FILTER;
    //被代理方法
    private static final Method CGLIB$getTicket$0$Method; 
    //代理方法
    private static final MethodProxy CGLIB$getTicket$0$Proxy;
    private static final Object[] CGLIB$emptyArgs;
    private static final Method CGLIB$equals$1$Method;
    private static final MethodProxy CGLIB$equals$1$Proxy;
    private static final Method CGLIB$toString$2$Method;
    private static final MethodProxy CGLIB$toString$2$Proxy;
    private static final Method CGLIB$hashCode$3$Method;
    private static final MethodProxy CGLIB$hashCode$3$Proxy;
    private static final Method CGLIB$clone$4$Method;
    private static final MethodProxy CGLIB$clone$4$Proxy;

    static void CGLIB$STATICHOOK1() {
        CGLIB$THREAD_CALLBACKS = new ThreadLocal();
        CGLIB$emptyArgs = new Object[0];
        Class var0 = Class.forName("kdaddy.com.cglibDynamic.Ticket$$EnhancerByCGLIB$$4e79a04a");
        Class var1;
        CGLIB$getTicket$0$Method = ReflectUtils.findMethods(new String[]{"getTicket", "()V"}, (var1 = Class.forName("kdaddy.com.cglibDynamic.Ticket")).getDeclaredMethods())[0];
        CGLIB$getTicket$0$Proxy = MethodProxy.create(var1, var0, "()V", "getTicket", "CGLIB$getTicket$0");
        Method[] var10000 = ReflectUtils.findMethods(new String[]{"equals", "(Ljava/lang/Object;)Z", "toString", "()Ljava/lang/String;", "hashCode", "()I", "clone", "()Ljava/lang/Object;"}, (var1 = Class.forName("java.lang.Object")).getDeclaredMethods());
        CGLIB$equals$1$Method = var10000[0];
        CGLIB$equals$1$Proxy = MethodProxy.create(var1, var0, "(Ljava/lang/Object;)Z", "equals", "CGLIB$equals$1");
        CGLIB$toString$2$Method = var10000[1];
        CGLIB$toString$2$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/String;", "toString", "CGLIB$toString$2");
        CGLIB$hashCode$3$Method = var10000[2];
        CGLIB$hashCode$3$Proxy = MethodProxy.create(var1, var0, "()I", "hashCode", "CGLIB$hashCode$3");
        CGLIB$clone$4$Method = var10000[3];
        CGLIB$clone$4$Proxy = MethodProxy.create(var1, var0, "()Ljava/lang/Object;", "clone", "CGLIB$clone$4");
    }
}    
复制代码

我们通过代理类的源码可以看到,代理类会获得所有在父类继承来的方法,并且会有MethodProxy与之对应,当然被final修饰的方法除外,上述源码中我们也确实没有看到之前的refundTicket方法。接下来往下看。

咱们看其中一个方法的调用。

//代理方法(methodProxy.invokeSuper会调用)
final void CGLIB$getTicket$0() {
        super.getTicket();
    }

//被代理方法(methodProxy.invoke会调用,这就是为什么在拦截器中调用methodProxy.invoke会死循环,一直在调用拦截器)
    public final void getTicket() {
        MethodInterceptor var10000 = this.CGLIB$CALLBACK_0;
        if (var10000 == null) {
            CGLIB$BIND_CALLBACKS(this);
            var10000 = this.CGLIB$CALLBACK_0;
        }

        if (var10000 != null) {
             //调用拦截器
            var10000.intercept(this, CGLIB$getTicket$0$Method, CGLIB$emptyArgs, CGLIB$getTicket$0$Proxy);
        } else {
            super.getTicket();
        }
    }
复制代码

通过上述,我们看下getTicket整个的调用链路: 调用getTicket()方法->调用拦截器->methodProxy.invokeSuper->CGLIBgetTicketgetTicket0->被代理的getTicket方法。

接下来,咱们再来看一下比较核心的MethodProxy,咱们直接看下核心:methodProxy.invokeSuper,具体源码如下:

 public Object invokeSuper(Object obj, Object[] args) throws Throwable {
        try {
            this.init();
            MethodProxy.FastClassInfo fci = this.fastClassInfo;
            return fci.f2.invoke(fci.i2, obj, args);
        } catch (InvocationTargetException var4) {
            throw var4.getTargetException();
        }
    }
    
//进一步看一下FastClassInfo
private static class FastClassInfo {
        FastClass f1;//被代理类FastClass
        FastClass f2;//代理类FastClass
        int i1; //被代理类的方法签名(index)
        int i2;//代理类的方法签名

        private FastClassInfo() {
        }
    }
复制代码

上面代码调用过程就是获取到代理类对应的FastClass,并执行了代理方法。还记得之前生成三个class文件吗?TicketEnhancerByCGLIBEnhancerByCGLIB4e79a04aFastClassByCGLIBFastClassByCGLIBf000183.class就是代理类的FastClass,TicketFastClassByCGLIBFastClassByCGLIBa79cabb2.class就是被代理类的FastClass。

关于FastClass Cglib动态代理执行代理方法效率之所以比JDK的高是因为Cglib采用了FastClass机制,它的原理简单来说就是:为代理类和被代理类各生成一个Class,这个Class会为代理类或被代理类的方法分配一个index(int类型)。 这个index当做一个入参,FastClass就可以直接定位要调用的方法直接进行调用,这样省去了反射调用,所以调用效率比JDK动态代理通过反射调用高。下面我们反编译一个FastClass看看:

public int getIndex(Signature var1) {
        String var10000 = var1.toString();
        switch(var10000.hashCode()) {
        case -80792013:
            if (var10000.equals("getTicket()V")) {
                return 0;
            }
            break;
        case 189620111:
            if (var10000.equals("cancelTicket()V")) {
                return 1;
            }
            break;
        case 1826985398:
            if (var10000.equals("equals(Ljava/lang/Object;)Z")) {
                return 2;
            }
            break;
        case 1913648695:
            if (var10000.equals("toString()Ljava/lang/String;")) {
                return 3;
            }
            break;
        case 1984935277:
            if (var10000.equals("hashCode()I")) {
                return 4;
            }
        }

        return -1;
    }
    ...此处省略部分代码...
    public Object invoke(int var1, Object var2, Object[] var3) throws InvocationTargetException {
        Ticket var10000 = (Ticket)var2;
        int var10001 = var1;

        try {
            switch(var10001) {
            case 0:
                var10000.getTicket();
                return null;
            case 1:
                var10000.cancelTicket();
                return null;
            case 2:
                return new Boolean(var10000.equals(var3[0]));
            case 3:
                return var10000.toString();
            case 4:
                return new Integer(var10000.hashCode());
            }
        } catch (Throwable var4) {
            throw new InvocationTargetException(var4);
        }

        throw new IllegalArgumentException("Cannot find matching method/constructor");
    }
    
复制代码

FastClass并不是跟代理类一块生成的,而是在第一次执行MethodProxy invoke/invokeSuper时生成的并放在了缓存中。

//MethodProxy invoke/invokeSuper都调用了init()
private void init() {
        if(this.fastClassInfo == null) {
            Object var1 = this.initLock;
            synchronized(this.initLock) {
                if(this.fastClassInfo == null) {
                    MethodProxy.CreateInfo ci = this.createInfo;
                    MethodProxy.FastClassInfo fci = new MethodProxy.FastClassInfo();
                    fci.f1 = helper(ci, ci.c1);//如果缓存中就取出,没有就生成新的FastClass,此处感兴趣的小伙伴可以仔细看一下底层源码,老猫此处提及一下。
                    fci.f2 = helper(ci, ci.c2);
                    fci.i1 = fci.f1.getIndex(this.sig1);//获取方法的index
                    fci.i2 = fci.f2.getIndex(this.sig2);
                    this.fastClassInfo = fci;
                    this.createInfo = null;
                }
            }
        }

    }
复制代码

总结

如果屏幕前的你也像张小帅那样,该如何应对呢?其实大部分的答案都在上面了。总结一下 (1)JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。 (2)JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。 (3)JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。

(九)DFI接口时序 文章目录一、DFI Interface 一、DFI Interface   DFI接口是连接DDR Controller与DDR_PHY之间的通用接口,其信号组如下表:        阅读详情

相关推荐

Synopsys AXI VIP 从环境搭建到首个验证场景运行

本文详细介绍了Synopsys AXI VIP从环境搭建到首个验证场景运行的全过程,包括VIP安装、示例工程生成、验证环境解析、仿真调试技巧及进阶优化。特别针对AXI协议验证中的常见问题提供了实用解决方案,帮助工程师快速掌握这一SoC验证必备工具。

weixin_29185493的博客 340

cglib和jdk动态代理区别_五、代理模式详解

7.代理模式7.1.课程目标1、掌握代理模式的应用场景和实现原理。2、了解静态代理和动态代理的区别。3、了解CGLib和JDK Proxy的根本区别。4、手写实现定义的动态代理。7.2.内容定位都知道 SpringAOP 是用代理模式实现,到底是怎么实现的?我们来一探究竟,并且自己仿真手写 还原部分细节。7.3.代理模式定义代理模式(ProxyPattern)是指为其他对象提供一种代理,以控制对这...

weixin_28917223的博客 192

Vue+ECharts-GL 3D地图实战:5层叠加打造炫酷中国地图(附完整代码)

本文详细介绍了如何利用Vue和ECharts-GL构建具有强烈立体感的3D中国地图。通过5层图层的巧妙叠加与样式调校,实现了从背景阴影到交互高光的完整视觉层次,并整合了动态飞线与散点标记。文章提供了完整的代码实现、核心配置解析以及性能优化与视觉调优的实战技巧,帮助开发者快速打造专业级的交互式地图可视化应用。

d6e7f8g9h的博客 649

$$enhancerBySpringCGLIB$$空指针异常

容器扫描bean生成代理类的时候,public和protected方法可以被正常代理,而private方法的不会被代理,属性的注入也是在代理类中完成,所以public/protected方法获取的注入属性是完成注入的属性,private方法获取的是未完成注入时的属性,所以是null ...

weixin_50688121的博客 1万+

GD32F470 DSP库移植避坑指南:从CMSIS版本冲突到AC6工程配置

本文详细解析了在GD32F470平台上移植CMSIS-DSP库的完整流程与关键避坑点。针对CMSIS版本冲突、AC6编译器下的浮点ABI配置、DSP库源文件添加等核心难题,提供了经过验证的解决方案,帮助开发者高效完成移植,确保硬件FPU正常工作并优化性能。

data3的博客 529

coze开发-5、给智能体添加“技能”

中间编排与技能组件 中间编排的定义 中间编排是指在智能体的构建过程中,使用一些工具对智能体进行协调和管理。通过这些工具,我们能够更好地实现智能体在特定业务场景中的应用。

andyyah晓波的博客 527

CGlib动态代理

一、CGlib介绍 参考链接:设计模式之代理模式https://www.cnblogs.com/lixiuyu/p/5919643.html CGlib(Code Generation Library)是一个强大的,高性能的代码生成库。 它被广泛使用在基于代理的AOP框架(例如Spring AOP和dynaop)提供方法拦截(interception)。 它可以在运行期扩展Java类与实现...

wyplj2015的博客 351

拆解一个800G光模块:手把手带你认识里面的MT插芯和光纤阵列(FA)

本文详细拆解了800G光模块中的关键组件MT插芯和光纤阵列(FA),揭示了并行光学技术如何实现高速数据传输。通过显微镜下的精密观察,展示了MT插芯的高精度构造和光纤阵列的连接奥秘,同时解析了高精度研磨工艺对光信号传输的重要性。这些微型组件是高速收发模块实现800Gbps带宽的核心技术。

weixin_30839881的博客 1546

漫画:AOP 面试造火箭事件始末

这是一个困扰我司由来已久的难题,Dubbo 了解过吧,对外提供的服务可能有多个方法,一般我们为了不给调用方埋坑,会在每个方法里把所有异常都 catch 住,只返回一个 result,调用方会根据这个 result 里的 success 判断此次调用是否成功,举个例子 publicclassServiceResultTO<T>extendsSerializable{ privatestaticfinallongserialVersion...

weixin_39787242的博客 5059

YOLO26涨点改进 | 全网独家创新,注意力改进篇 | TGRS 2025 | 引入APCM自适应像素级协同机制,动态增强目标区域、抑制背景噪声,助力YOLO26做红外小目标检测有效涨点

本文提出一种基于APCM模块改进的YOLO26网络模型,通过像素级局部-全局协同建模动态增强目标特征并抑制背景噪声。APCM模块采用轻量化设计,无需复杂参数,在特征提取阶段有效提升目标区域特征表达质量,尤其适用于低对比度和复杂场景下的目标检测。实验表明,该方法能显著提高小目标检测精度和模型鲁棒性,同时保持较低计算开销。模块通过局部特征分支和全局特征分支的协同融合,实现了对红外小目标的有效增强,在NUAA-SIRST和IRSTD-1K数据集上性能优于现有方法。文章还提供了完整的代码实现和配置指南。

Ai缝合怪、助力小伙伴高效发论文 188

CAPL概述与环境搭建

CANoe和CANalyzer是Vector公司开发的两款用于汽车电子系统开发和测试的工具。CANoe主要用于网络开发、仿真和测试,而CANalyzer则主要用于网络分析和诊断。两者都支持CAPL脚本语言,可以用于编写复杂的测试脚本和仿真模型。CAPL Browser是CANoe/CANalyzer中用于编写、编辑和调试CAPL脚本的工具。它提供了一个集成的开发环境,支持语法高亮、代码自动补全、调试等功能。菜单栏:包含文件操作、编辑、编译、调试等功能。工具栏。

闲人编程的博客 1662

大聪明助你拿Offer | JDK 动态代理和 CGLIB 动态代理的区别是什么?

大聪明专治各种答不上来😉

不肯过江东丶 1115

大疆FPGA/芯片开发工程师(A卷)笔试题(含详解)

大疆芯片开发岗A卷 一、单选题 1.下列关于多bit数据跨时钟域的处理思路,错误的有   A、发送方给出数据,接收方用本地时钟同步两拍再使用   B、发送方把数据写到异步fifo,接收方从异步fifo里读出   C、对于连续变化的信号,发送方转为格雷码发送,接收方收到后再转为二进制   D、发送方给出数据,发送方给出握手请求,接收方收到后回复,发送方撤销数据 2.对12.918做无损定点化,需要的最小位宽是多少位,位宽选择11位时的量化误差是多少   A、12位,0.0118   B、13位,0.0039

Mr.翟的博客 2万+

面经手册 · 第13篇《除了JDK、CGLIB,还有3种类代理方式?面试又卡住!》

作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!???? 一、前言 编程学习,先铺宽度还是挖深度? 其实技术宽度与技术深度是相辅相成的,你能了解多少技术是和你对一个技术的理解深度有关,而你能对一个技术探究的多深又是需要你有一定的广度认知。否则如果只去了解皮毛或者死磕一段代码,收获都不一定有多大,或者要付出很大的成本。 技术瓶颈,与年龄相关还是大厂? 亲身当过面试官很久,也面试过很多人。有时候不一定年龄很大就技术好,也不一定刚工作2年左右就不行。往往

bugstack虫洞栈 2168

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

第 13 篇《除了 JDK、CGLIB,还有 3 种类代理方式?面试又卡住!》

编程学习,先铺宽度还是挖深度?其实技术宽度与技术深度是相辅相成的,你能了解多少技术是和你对一个技术的理解深度有关,而你能对一个技术探究的多深又是需要你有一定的广度认知。否则如果只去了解皮毛或者死磕一段代码,收获都不一定有多大,或者要付出很大的成本。技术瓶颈,与年龄相关还是大厂?亲身当过面试官很久,也面试过很多人。有时候不一定年龄很大就技术好,也不一定刚工作 2 年左右就不行。往往我们说的一些面试造火箭,但是在这些求职者的回答中,都能给出非常准确的答案。也就是他能回答到点上,这是懂了才能做到的。

wr_java的博客 303

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大聪明助你拿Offer | 目标类实现了接口一定会走 JDK 动态代理吗?

大聪明专治各种答不上来😉

不肯过江东丶 483

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【漫画】AOP 面试造火箭事件始末

这是一个困扰我司由来已久的难题,Dubbo 了解过吧,对外提供的服务可能有多个方法,一般我们为了不给调用方埋坑,会在每个方法里把所有异常都 catch 住,只返回一个 result,调用方...

公众号:Java后端 455

最全【Java从0到架构师】Spring - 生命周期、代理,华为4面技术5面HR

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。2、Redis学习笔记及学习思维脑图。

2401_84584609的博客 795

java面试必备--JAVA基础篇(十二) 之 反射

相信很多同行小伙伴会因为许多原因想跳槽,不论是干得不开心还是想跳槽涨薪,在如此内卷的行业,我们都面临着“面试造火箭,上班拧螺丝”的局面,鉴于当前形势博主呕心沥血整理的干货满满的造火箭的技巧来了,本博主花费2个月时间,整理归纳java全生态知识体系常见面试题!总字数高达百万! 干货满满,每天更新,关注我,不迷路,用强大的归纳总结,全新全细致的讲解来留住各位猿友的关注,希望能够帮助各位猿友在应付面试笔试上!当然如有归纳总结错误之处请各位指出修正!如有侵权请联系博主QQ1062141499! ...

用键盘与世界交流 600

最新【Java从0到架构师】Spring - 生命周期、代理(1),java面试题基础部分

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下。注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友互联网工程师必备的面试1000题而且从上面三家来看,呀,因此我建议大家可以去,里面近。

2301_82244514的博客 402

JavaWeb编程面试题——Spring Framework

Spring Framework面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待。不以刷题进大厂为目的,而是以学习为目的。这里的知识点会持续更新,目录也会随时进行调整。

蜗牛老师,专注编程领域 1886

Spring AOP详解【漫画版】

文章目录 【漫画】AOP 面试造火箭事件始末 原博github

qq_24095055的博客 601
上一篇: 不是说Spring三级缓存可以解决循环依赖吗?怎么我写的就GG了
下一篇: maven中有重复依赖该怎么搞
superjava_
博客等级 码龄5年 254粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值