按代理创建的时间,可以分为静态代理和动态的代理
    静态代理:在程序运行之前,代理类就以.class文件格式存在
    动态代理:在程序运行时,由反射机制动态创建而成。

    JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

    静态代理例子:

    1. //抽象主题
    2. interface Subject{
    3. void operator();
    4. }
    5. //具体主题
    6. class RealSubject implements Subject{
    7. @Override
    8. public void operator(){
    9. System.out.println("RealSubject Operator()");
    10. }
    11. }
    12. //代理类
    13. class ProxySubject implements Subject{
    14. private Subject subject;
    15. public ProxySubject(Subject subject){
    16. this.subject = subject;
    17. }
    18. @Override
    19. void operator(){
    20. System.out.println("Proxy Before");
    21. subject.operator();
    22. System.out.println("Proxy after");
    23. }
    24. }
    25. //客户端
    26. class client{
    27. public static void main(String[] args){
    28. Subject subject = new RealSubject();
    29. ProxySubject proxy = new ProxySubject(subject);
    30. proxy.operator();
    31. }
    32. }

    静态代理的弊端就是代理类要实现一个具体的类,由此引申出动态代理,让我们的具体的代理类在运行时候通过JAVA反射机制去创建。
    动态代理核心是这两个类:Proxy.java InvocationHander.java
    Proxy的newProxyInstance帮我们执行了生成代理类——获取构造器——生成代理对象这三步;

    1. //调度处理器接口
    2. interface InvocationHandler{
    3. /**
    4. * invode方法封装了我们要代理的对象实例的数据。
    5. * @param proxy 代理的对象的实例
    6. * @param method 代理实现的方法
    7. * @param args 代理方法需要的参数
    8. */
    9. public Object invoke(Object proxy,Method method,Object[] args) throws Throwable;
    10. }
    11. //代理类,相当于静态代理中ProxySubject功能
    12. class Proxy{
    13. public static Object newProxyInstance(ClassLoader loader,
    14. Class<?>[] interfaces,
    15. InvocationHandler h){
    16. //...
    17. }
    18. }

    动态代理例子:

    1. //抽象主题
    2. interface Subject{
    3. void operator();
    4. }
    5. //具体主题
    6. class RealSubject implements Subject{
    7. @Override
    8. public void operator(){
    9. System.out.println("RealSubject Operator()");
    10. }
    11. }
    12. //代理类
    13. class ProxyHandler implements InvocationHandler{
    14. private Object tar;
    15. public Object bind(Object tar){
    16. this.tar = tar;
    17. return Proxy.newProxyInstance(tar.getClass().getClassLoader(),
    18. tar.getClass().getInterfaces(),
    19. this)
    20. }
    21. @Override
    22. public Object invoke(Object proxy,Method method,Object[] args){
    23. Object result = null;
    24. //这里就可以进行所谓的AOP编程了
    25. //在调用具体函数方法前,执行功能处理
    26. System.out.println("Proxy Before");
    27. result = method.invoke(tar,args)
    28. System.out.println("Proxy after");
    29. return result;
    30. }
    31. }
    32. //客户端
    33. class client{
    34. public static void main(String[] args){
    35. //Subject subject = new RealSubject();
    36. ProxyHandler proxy = new ProxyHandler();
    37. //这一步动态生成代理类
    38. Subject subject = proxy.bind(new RealSubject())
    39. subject.operator();
    40. }
    41. }