DEMO - JDK动态代理(深入理解篇)

本文详细介绍了Java动态代理的实现,包括接口类、目标类和代理逻辑类的定义,以及Main类中如何使用Proxy.newProxyInstance创建并调用代理对象。在代理逻辑中,展示了在方法调用前后插入自定义业务逻辑。执行效果显示了代理类在方法调用时如何介入。文章旨在帮助读者理解Java动态代理的工作机制及其在AOP切面编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看下DEMO中用到的类。注意看类中的注释。

 

 接口类

public interface IMyDao {
	public String query();

	public void delete();
}

目标类(实现接口的类)

/**
 * MyDao 目标类
 **/
public class MyDao implements IMyDao {
	@Override
	public String query() {
		System.out.println("------jdk dynamic proxy...querying......");
		return "query_result";
	}

	@Override
	public void delete() {
		System.out.println("------jdk dynamic proxy...deleting......");
	}
}

 切面/代理逻辑类(InvocationHandler类)

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

public class CustomInvocationHandler implements InvocationHandler {

	private Object object;

	public CustomInvocationHandler(Object obj){
		this.object = obj;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("------before----call target method........"); // 代理类的业务逻辑
		Object invoke = method.invoke(object, args); // 执行目标对象的方法
		System.out.println("------after-----call target method........"); // 代理类的业务逻辑
		return invoke;
	}
}

Main类

import java.lang.reflect.Proxy;

public class Main {
	public static void main(String[] args) {

		/*
		 * newProxyInstance干了什么? 猜测,
		 * 1. 拼接代理类的源码
		 * 2. 把代理类源码输出到*.java 文件($Proxy.java)
		 * 3. 动态编译源码文件为$Proxy.class 字节码
		 * 4. 通过类加载器把代理类加到到JVM中
		 * 5. 通过Class.forName("*").newInstance 反射实例化这个对象
		 *
		 * 实际:
		 * JDK直接在内存中生成字节码
		 *
		 **/
		IMyDao myDaoProxy = (IMyDao) Proxy.newProxyInstance(Main.class.getClassLoader(),
				new Class[]{IMyDao.class}, // 生成一个实现该接口的代理类,并继承Proxy类。在代理类中重写接口中的每个方法
				new CustomInvocationHandler(new MyDao())); // 为代理类传入我们的切面/代理逻辑类(InvocationHandler)

		/*
		 * 最终效果:
		 * 当调用这个代理对象某个方法时,本质是调用了前面传入的CustomInvocationHandler的invoke方法。
		 **/
		myDaoProxy.query();
		myDaoProxy.delete();
	}
}

执行效果:

如有问题,有疑惑欢迎留言,私信一起探讨~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值