jdk动态代理-this对象

一、代理类工具

package com.haojie.util;

import com.haojie.service.inf.UserService;

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

/**
 * @author caopeng
 * @className ProxyUtil
 * @date 2025-05-26 19:07
 */
public class ProxyUtil {
    public static UserService createProxy(UserService userService) {
        /*newProxyInstance(ClassLoader loader,
                Class<?>[] interfaces,
                InvocationHandler h)
                参数1:用于指定一个类加载器
                参数2:指定生成的代理长什么样子,也就是有哪些方法
                参数3:用来指定生成的代理对象要干什么事情
                */
        // Star starProxy = ProxyUtil.createProxy(s);
        // starProxy.sing("好日子") starProxy.dance()
        UserService starProxy = (UserService) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),
                new Class[]{UserService.class},
                new InvocationHandler() {
                    @Override //回调方法:当主程序执行sing方法时会调用invoke,并将参数传过来
                    // proxy就是代理对象starProxy,method指sing,args指"好日子"
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //代理对象要做的事情,会在这里写代码
                        String name = method.getName();
                        String proxyClassName = proxy.getClass().getName();
                        System.out.println("被代理对象名称="+proxyClassName);
                        System.out.println("代理对象被调用了="+name);
                        return method.invoke(userService, args);
                    }
                });
        return starProxy;
    }


}

 

接口的实现方法

package com.haojie.service.impl;

import com.haojie.service.inf.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author caopeng
 * @className UserServiceImpl
 * @date 2025-05-26 09:54
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void doAddStudent() {
        String name = this.getClass().getName();
        System.out.println("doAddStudent className="+name);

    }

    @Override
    public void addStudent() {
        String name = this.getClass().getName();
        System.out.println("addStudent className="+name);
        doAddStudent();
    }


}

 

打印结果

 

com.sun.proxy.$Proxy0
被代理对象名称=com.sun.proxy.$Proxy0
代理对象被调用了=addStudent
addStudent className=com.haojie.service.impl.UserServiceImpl
doAddStudent className=com.haojie.service.impl.UserServiceImpl

 

 通过上面的打印可以得出一个结论,无论是通过代理对象,还是通过原对象 调用方法,在被代理类里面打印的this对象,都是原对象,而不是代理对象。如果还是代理对象的话,会造成递归调用。

 

  • this 是 Java 语言层面的概念,它指向当前执行方法的对象实例。

  • 动态代理是基于接口的,代理对象并不继承目标类,而是实现相同的接口,所以:

    • 代理对象(proxy)和原始对象(target)是两个不同的对象

    • 当 method.invoke(target, args) 执行时,方法运行在 target 上,this 自然指向 target

posted @ 2025-05-27 19:23  阿瞒123  阅读(15)  评论(0)    收藏  举报