JAVA 2022.8.11 8.12课程总结

一、代理:静态代理和动态代理

1.1静态代理

//静态代理
public class Easy {
	public static void main(String[] args) {
		IWorker worker=ProxyFactory.getProxy();
		worker.dosomething();
	}
	
}
/**
 * 接口
 * @author ambition
 *
 */
interface IWorker{
	void dosomething();
}

class WorkerA implements IWorker{
	@Override
	public void dosomething() {
		System.out.println("---实际的业务逻辑代码---");
	}
}

class WorkerProxy implements IWorker{
	//被代理对象
	IWorker worker;
	WorkerProxy(IWorker worker){
		this.worker=worker;
	}
	public void dosomething() {
		System.out.println("--前置代码--");
		worker.dosomething();
		System.out.println("--后置代码--");
		
	}
}

/**
 * 生产代理
 * @author ambition
 *
 */
class ProxyFactory{
	static IWorker getProxy() {
		IWorker w=new WorkerA();
		return new WorkerProxy(w);
	}
}

1.2 JDK实现的动态代理
 

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

public class Easy {
	public static void main(String[] args) {
		IWorker worker=new WorkerA();
		IWorker proxy=(IWorker)ProxyFactory.getProxy(worker);
		//obj.getClass().getName();
		proxy.dosomething();
	}
}
//动态代理 
//JDK实现的动态代理,被代理的对象必须要实现一个接口
interface IWorker{
	String dosomething();
}
class WorkerA implements IWorker{
	@Override
	public String dosomething() {
		System.out.println("--实际的业务代码--");
		return "Nihao";
	}
}

class MyProxy implements InvocationHandler{
//被代理的对象
Object proxydeObj;
public MyProxy(Object proxydeObj) {
	this.proxydeObj=proxydeObj;
}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object result=null;
		System.out.println("--前置代码");
		//驱动被代理对象执行对应的方法--执行实际业务逻辑
		try {
			result=method.invoke(proxydeObj, args);
			System.out.println("---正常完成业务的代码块");
		}catch(Exception e){
			System.out.println("---异常情况下执行的代码");
		}finally {
			System.out.println("---后置代码");
		}
		return result;
	}
}

class ProxyFactory{
	static Object getProxy(Object obj) {
		Class clazz=obj.getClass();
		MyProxy proxytask=new MyProxy(obj);
		return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(),proxytask);
	}
}

1.3 cjlib实现的动态代理

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 Easy {
	private void mian() {
		Worker w=new Worker();
		Factory f=new Factory(w);
		w=(Worker)f.getProxy();
		w.test();
	}
}
class Worker{
	void test() {
		System.out.println("----实际业务逻辑");
	}
}
class Factory implements MethodInterceptor{
	Object proxyedObj;
	Factory(Object proxyedObj){
		this.proxyedObj=proxyedObj;
	}
	public Object getProxy() {
		Enhancer en=new Enhancer();
		en.setSuperclass(proxyedObj.getClass());
		en.setCallback(this);
		return en.create();
	}
	public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
		System.out.println("---前置");
		Object result=method.invoke(proxyedObj, args);
		System.out.println("---后置");
		return result;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值