java 反射之静态and动态代理

首先说一下我们什么情况下使用代理?

(1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。

(2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。

(3)Spring的AOP机制就是采用动态代理的机制来实现切面编程。
---------------------

一,静态代理

package org.rcisoft.business.reflectDemo;

/**
 * @author: wsj
 * @date: 2018/10/13
 * @time: 18:18
 */
//静态代理
//接口
public interface StaticReflect {
    void show();
}
//被代理类
class Nike implements StaticReflect{
    @Override
    public void show() {
        System.out.println("nike开始生产衣服...");
    }
}
//代理类
class ProxyClass implements StaticReflect{
    StaticReflect sr;

    public ProxyClass(StaticReflect st){
        this.sr = st;
    }
    @Override
    public void show() {
        System.out.println("代理类开始执行,收代理费$10");
        sr.show();
    }
}

class testStaticReflect{
    public static void main(String[] args) {
        Nike nick = new Nike();
        ProxyClass proxyClass = new ProxyClass(nick);

        proxyClass.show();
    }
}

二,动态代理

package org.rcisoft.business.reflectDemo;

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

/**
 * @author: wsj
 * @date: 2018/10/13
 * @time: 18:42
 */

public interface ProxyTest {

}
//反射之动态代理
//接口
interface Subject{
    void action();
}
//被代理类
class RealSubject implements Subject{
    @Override
    public void action() {
        System.out.println("动态被代理类开始执行啦!...");
    }
}
//代理类
class MyInvocationHandler implements InvocationHandler {
    Object obj; //实现了被代理类的对象的说明

    public Object blind(Object obj) {
        this.obj = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws InvocationTargetException, IllegalAccessException {
        return method.invoke(obj, args);
    }
}
class testProxyMethod{
        public static void main(String[] args) {
            RealSubject realSubject = new RealSubject();
            MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
            Subject subject = (Subject) myInvocationHandler.blind(realSubject);
            realSubject.action();
        }
    }

 

posted @ 2018-10-14 13:57  wsjun  阅读(278)  评论(0编辑  收藏  举报