设计模式-JDK动态代理

  1. 简介
    代理模式主要对我们方法执行之前与之后实现增强
  2. 应用场景
    日志打印
    RPC的远程调用框架
    mybatis mapper
    AOP
    事务处理
    自定义注解
    springboot全局捕获异常
    方法前后实现拦截
  3. 优点
    减少代码冗余,提高代码复用性,安全性,隐藏真实信息,避免非法侵入
  4. 动态代理
    不需要些代理类,统一采用程序生产
    jdk动态代理:采用实现接口模式增强
    实现invocationhandler接口重写invoke方式实现回调增强
    生成代理类的核心思想
    1. 使用java反射机制获取当前接口的信息 javase反射机制
    2. 拼接java代码,将java代码写入在本地文件
    3. 将java代码编译为class文件
    4. 程序直接读取该class文件到内存中即可。
  5. 实际案例

业务接口类

package com.huahailong.proxy.service;
/***
 * 业务接口类
 * @author Administrator
 *
 */
public interface IndexService {
	String index(String name);
}

业务接口类实现

package com.huahailong.proxy.service;
/***
 * 业务接口类实现
 * @author Administrator
 *
 */
public class IndexServiceImpl implements IndexService {
	public String index(String name) {
		System.out.println("index方法被执行了");
		return "hello " + name;
	}
}

业务代理类

package com.huahailong.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/***
 * 业务代理类
 * 
 * @author Administrator
 *
 */
public class IndexServiceProxy implements InvocationHandler {

	private Object target;
	public IndexServiceProxy(Object target) {
		this.target = target;
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// 代理方法执行前
		System.out.println("代理方法执行前");
		Object result = method.invoke(target, args);
		System.out.println("代理方法执行后");
		return result;
	}

	/**
	 * 获取被代理接口实例对象
	 * 
	 * @param <T>
	 * @return
	 */
	public <T> T getProxy() {
		return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
}

测试

package com.huahailong;

import com.huahailong.proxy.IndexServiceProxy;
import com.huahailong.proxy.service.IndexService;
import com.huahailong.proxy.service.IndexServiceImpl;
public class IndexTest {
	
	public static void main(String[] args) {
		IndexService indexService=  new IndexServiceProxy(new IndexServiceImpl()).getProxy();
		indexService.index("詹姆斯");
	}
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值