反射案例------动态代理

概述:

代理顾名思义就是一个人不需要自己亲自去做某一件是,会有一个代理者帮他去做这件事,就好像明星和经纪人的关系,明星是被代理者,经纪人是代理者,在java中也存在这种关系:动态代理。

 

在动态代理中,代理对象和被代理对象的事项前提是:

  1. 代理对象和被代理对象要实现同一个接口
  2. 代理对象要和被代理对象使用同一个类加载器

 

 

下面是一个代码的案例:

package com.heima.userJSTL;

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

public class RunTimeProxyObject {
    public static void main(String[] args) {
        Supermen supermen = new Supermen();//首先创建被代理的对象
        Persons proxy = (Persons) proxyFactary.getProxy(supermen);
        String believef = proxy.believef();
        System.out.println(believef);
        proxy.eat("四川麻辣烫");

    }


}

//创建公共接口
interface Persons {
    String believef();

    void eat(String food);
}

//创建被代理类
class Supermen implements Persons {

    @Override
    public String believef() {
        return "I Believe I can fly";
    }

    @Override
    public void eat(String food) {
        System.out.println("超人吃" + food);
    }
}


//创建一个动态代理类的工厂(根据传入的被代理对象创建代理对象)
class proxyFactary {

    public static Object getProxy(Object obj) {//传入被代理对象
        MyInvocationhandler handler = new MyInvocationhandler();
        handler.band(obj);
        Object proxyInstance = Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);//参数依次是:被代理对象的类加载器,被代理对象的实现接口,Invocationhandler接口的实现类对象
        return proxyInstance;
    }
}

//自定义InvocationHandler的实现类
class MyInvocationhandler implements InvocationHandler {
    private Object obj;

    public void band(Object obj) {
        this.obj = obj;
    }


    //在上面的创建了代理对象之后,我们无论通过代理对象调用什么方法都会动态的执行下面的invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//三个参数分别是代理对象,代理对象要执行的方法,方法参数
        Object invoke = method.invoke(obj, args);//调用代理对象的方法,这里的obj是被代理对象
        return invoke;

    }
}

 

posted @ 2020-10-09 13:44  Joker-0927  阅读(100)  评论(0编辑  收藏  举报
// 侧边栏目录