一、代理:静态代理和动态代理
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;
}
}