Java 动态代理

1、动态代理

运行时动态地对某些内容代理它做其他的事情。

2、接口

public interface Saying {

	public void say(String name);
	
	public void talk(String name);
	
}

public class SayingImpl implements Saying {

	public void say(String name) {
		System.out.println(name + ":大家好!");
	}

	public void talk(String name) {
		System.out.println(name + ":始终贯彻社会主义核心价值观!");
	}

}

3、cglib

public class CglibProxy implements MethodInterceptor {

	Enhancer enhancer = new Enhancer();
	public Object getProxy(Class<?> clazz) {
		// 设置需要创建的子类
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);
		// 通过字节码技术动态创建子类实例
		return enhancer.create();
	}
	
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		// 目标方法执行前
		System.out.println("-----cglib-----");
		System.out.println("-----准备-----");
		// 目标方法调用
		Object result = proxy.invokeSuper(obj, args);
		// 目标方法执行后
		System.out.println("-----结束-----");
		return result;
	}

}

public class CglibProxyTest {

	public static void main(String[] args) {
		CglibProxy proxy = new CglibProxy();
		//通过动态代理生成子类的方式创建代理类
		Saying target = (Saying) proxy.getProxy(SayingImpl.class);
		target.say("张三");
		target.talk("李四");;
	}
	
}

4、javassist

public class JavassistProxy {

	@SuppressWarnings({ "deprecation", "rawtypes" })
	public Object getProxy(Class clazz) throws InstantiationException, IllegalAccessException {
		ProxyFactory proxyFactory = new ProxyFactory();
		proxyFactory.setSuperclass(clazz);
		
		proxyFactory.setHandler(new MethodHandler() {
			public Object invoke(Object self, Method thismethod, Method proceed, Object[] args) throws Throwable {
				System.out.println("-----javassist-----");
				System.out.println("-----方法调用前-----");
				Object result = proceed.invoke(self, args);
				System.out.println("-----方法调用后-----");
				return result;
			}
		});

		// 通过字节码技术动态创建子类实例
		return proxyFactory.createClass().newInstance();
	}
	
}

public class JavassistProxyTest {
	
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		JavassistProxy javassistProxy = new JavassistProxy();
		SayingImpl sayingImpl = (SayingImpl) javassistProxy.getProxy(SayingImpl.class);
		sayingImpl.say("张三");
		sayingImpl.talk("李四");
	}
	
}

5、jdk

public class MyInvocationHandler implements InvocationHandler {

	private Object target;
	
	public MyInvocationHandler(Object target) {
		this.target = target;
	}
	
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// 目标方法执行前
		System.out.println("-----JDK-----");
		System.out.println("-----准备-----");
		// 目标方法调用
		Object object = method.invoke(target, args);
		// 目标方法执行后
		System.out.println("-----结束-----");
		return object;
	}

}

public class JDKProxyTest {

	public static void main(String[] args) {
		// 被代理的业务类
		Saying target = new SayingImpl();
		// 将目标类与横切类编织在一起
		MyInvocationHandler handler = new MyInvocationHandler(target);
		// 创建代理实例
		Saying proxy = (Saying) Proxy.newProxyInstance(
				target.getClass().getClassLoader(), 	// 目标类加载器
				target.getClass().getInterfaces(), 		// 目标类接口
				handler);
		//横切类
		proxy.say("张三");
		proxy.talk("李四");
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值