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。
-

浙公网安备 33010602011771号