java之动态代理

java之动态代理

代理基础

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。

这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.。

代理分为三种:静态代理、动态代理、Cglib代理

本文将要介绍的就是动态代理。

动态代理

动态代理的特点

1、代理对象:不需要实现接口
2、代理对象的生成,是利用JDK的API,动态的在内存构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3、动态代理也叫JDK代理,接口代理

JDK中共生成代理对象的API代理类所在的包:java.lang.reflect.ProxyJDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整写法是:static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h )

ClassLoader loader,:指定当前目标对象使用类加载器,获取加载器的方法是固定的Class[] interfaces,:目标对象实现的接口的类型,使用泛型方式确认类型InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入

该方法可以在代理类中实现,也可以在main函数中实现。注:接口和目标类同静态代理中User和UserInfo方法一:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
​
public class LogHandler implements InvocationHandler {//被代理对象private Object play;
​//构造方法,并初始化被代理对象public LogHandler(Object play) {this.play = play;}
​@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable{//通过动态代理类,可以在调用之执行一些相关操作doBefore();System.out.println("调用被代理类对象的方法是: "+ method.getName()+" 抽象角色是"+method.getDeclaringClass());//调用被代理对象将要被执行的方法Object result = method.invoke(play,args);//通过动态代理类,可以在调用之后执行一些相关操作doAfter();return result;}
​public void doBefore(){System.out.println("before....光头强打飞机....");}private void doAfter(){System.out.println("after....光头强打完飞机....");}
}
​

测试代码:

public class ProxyTest {public static void main(String[] args){UserInfo userInfo =new UserInfo(1,"光头强","123");LogHandler handler = new LogHandler(userInfo);User user =(User) Proxy.newProxyInstance(userInfo.getClass().getClassLoader(),userInfo.getClass().getInterfaces(),handler);user.playGame();}
}

注意:动态代理建立在反射的基础上

方法二:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
​
public class Uproxy {private Object target;public Uproxy(Object target){this.target = target;}
​public Object getProxyInstance(){return  Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {doBefore();Object returnValue = method.invoke(target,args);doAfter();return returnValue;}});}public void doBefore(){System.out.println("before....光头强打飞机....");}private void doAfter(){System.out.println("after....光头强打完飞机....");}
}

测试代码:

public class ProxyT {public static void main(String[] args){User userInfo = new UserInfo();System.out.println(userInfo.getClass());
​User proxy = (User)new Uproxy(userInfo).getProxyInstance();proxy.playGame();
​
​}
}

注意:同静态代理不同的是,动态代理是以接口为返回对象的。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部