反射案例------动态代理
概述:
代理顾名思义就是一个人不需要自己亲自去做某一件是,会有一个代理者帮他去做这件事,就好像明星和经纪人的关系,明星是被代理者,经纪人是代理者,在java中也存在这种关系:动态代理。
在动态代理中,代理对象和被代理对象的事项前提是:
- 代理对象和被代理对象要实现同一个接口
- 代理对象要和被代理对象使用同一个类加载器
下面是一个代码的案例:
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; } }
迎风少年