静态代理以及JDK动态代理和CGLB动态代理的实现

主业务接口类

package 静态代理;

public interface Service {
	//主业务接口
  public String test();
}

目标类(代理要增强的主业务接口实现类)


public class ServiceImpl implements Service {
//目标类,代理类要增强的类。
	@Override
	public String test() {
		// TODO Auto-generated method stub
		System.out.println("执行test方法,输出小写单词。");
		return "abcd";
	}

}

第一种代理方式:静态代理

静态代理就类似于公司的法律顾问,管你需要不需要,它都会提前等着你。

//静态代理类
public class Proxy implements Service{//实现要增强的接口
	public Service target;//在代理这创建要增强的方法的对象
	public Proxy(Service target) {//传入的是Service的实现类对象,用父接口接受
		super();
		this.target = target;
	}

	public Proxy() {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public String test() {
		// TODO Auto-generated method stub
		String string = target.test().toUpperCase();
		return string;
	}

}
测试静态代理

public class TeststaticProxy {
	public static void main(String[] args) {
		//Service se= new ServiceImple();向上转
		//Service s=new Proxy(se);
		Service s= new Proxy(new ServiceImpl());//面向接口编程
		System.out.println(s.test());
	}
}

第二种代理方式:JDK动态代理(当要增强的类有接口时用)

相当于法院的律师,需要的时候才去请。

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

import 静态代理.Service;
import 静态代理.ServiceImpl;
//InvocationHandler 是代理实例的调用处理程序 实现的接口
/* jdk的动态代理
 * 每个代理实例都具有一个关联的调用处理程序。
 * 对代理实例调用方法时,
 * 将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。 
 */
public class TestdymicProxy {//ctrl f11 运行
	public static void main(String[] args) {
		final Service target = new ServiceImpl();//向上转
		Service service=(Service) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// TODO Auto-generated method stub
				Object result = method.invoke(target, args);//内部类不能使用非静变量
				if (result!=null) {//alt shift +z 快速转if语句
					result = ((String) result).toUpperCase();
					//由于test方法右返回值,所以进行非空判断
				}
				return result;
			}
		});		
		//代理对象执行目标方法时,会触发代理中的invoke(最外面的invoke)方法来增强。
		String result = service.test();//当执行这一步的时候,调用上面的invoke
		System.out.println(result);
	}
}

第三种代理方式:CGLB动态代理(当要增强的类无接口时用)

要增强的类
public class Service {
	public String test() {
		return "abc";
	}
}

代理类
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Mycglbproxy implements MethodInterceptor {
	private Service target;

	public Mycglbproxy(Service target) {
		super();
		this.target = target;
	}

	public Mycglbproxy() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Service CreatCglbProxy() {//创建代理:本质就是创建增强类的子类
		Enhancer enhancer = new Enhancer();//增强器
		//指定父类,cglb动态代理的原理就是子类增强父类
		enhancer.setSuperclass(Service.class);
		//设置回调函数。
		enhancer.setCallback(this);
		//creat方法创建动态cglb代理对象,也就是目标类的子类
		return (Service) enhancer.create();
	}
	//回调接口的方法
	@Override
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		// TODO Auto-generated method stub
		Object invoke = method.invoke(target, args);//参数为类对象和原方法参数
		if(invoke!=null) {//上一步是执行原方法,对返回值进行判断
			invoke = ((String)invoke).toUpperCase();
		}
		return invoke;
	}

}

测试cglb
public class TestCglb {
	public static void main(String[] args) {
		Service service = new Service();
		Service proxy = new Mycglbproxy(service).CreatCglbProxy();
		String test = proxy.test();
		System.out.println(test);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值