您的位置:首页 > 编程语言 > Java开发

动态代理模式(利用反射)(Java版本)

2019-04-06 21:27 429 查看

反射(动态代理的概述和实现)

  • A:动态代理概述

    代理:本来应该自己做的事情,请了别人来做,被请的人就是代理对象。
  • 举例:春节回家买票让人代买
  • 动态代理:在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

  • 在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib,Proxy类中的方法创建动态代理类对象

  • public static Object newProxyInstance(ClassLoader loader ,  Class<?>[] interfaces ,  InvocationHandler h)
  • 最终会调用InvocationHandler的方法
  • InvocationHandler Object invoke(Object proxy , Method method , Object[] args)

 

package com.heima.动态代理;

import java.lang.reflect.InvocationHandler;   //用到了反射的知识
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
    private Object target;
    
    public MyInvocationHandler(Object target) { //重载
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("权限校验");
        method.invoke(target, args);    //执行被代理target对象的方法
        System.out.println("日志记录");
        return null;
    }
}
 

 student.java

package com.heima.动态代理;

public interface Student { //interface 代表接口
    public void login();
    
    public void submit();
}
 

studentImp.java

package com.heima.动态代理;

public class StudentImp implements Student {

    @Override
    public void login() {
        System.out.println("登录");
    }

    @Override
    public void submit() {
        System.out.println("提交");
    }

}

 代理模式的应用:

1.远程代理

2.虚拟代理

3.安全代理

4.智能指引

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: