您好,欢迎访问一九零五行业门户网

java之动态代理

一、动态代理引入
package cn2; public interface iuserdao { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class userdaoimpl implements iuserdao { @override public void login() { system.out.println("用户登录"); } @override public void register() { system.out.println("用户注册"); } } package cn2; public class test { public static void main(string[] args) { iuserdao dao = new userdaoimpl(); dao.register(); dao.login(); } }
用户注册
用户登录
如果我要给每个方法都增加权限校验和日志记录的话,那么代码实现如下:
package cn2; public interface iuserdao { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class userdaoimpl implements iuserdao { @override public void login() { system.out.println("用户登录"); } @override public void register() { system.out.println("用户注册"); } } package cn2; public class userdaoimpl2 implements iuserdao { private void actioncheck(){ system.out.println("权限检查"); } private void record(){ system.out.println("日志记录"); } @override public void login() { this.actioncheck(); system.out.println("登录"); this.record(); } @override public void register() { this.actioncheck(); system.out.println("注册"); this.record(); } } package cn2; public class test { public static void main(string[] args) { iuserdao dao = new userdaoimpl2(); dao.register(); dao.login(); } }
权限检查
注册
日志记录
权限检查
登录
日志记录
为什么要单独写一个类去实现接口,并增加权限校验和日志记录呢?因为我们在设计的时候,要保证对扩展功能开发,对修改代码关闭的原则。我定义了一个新的类去实现接口,就是想扩展原来接口的功能,而不是在原有的实现类上修改。
但是,如果都这样设计,是很可怕的事情,如果需求一旦变更,那我们需要定义好多好多的实现类,太复杂了。怎么办?
在生活中,我们会遇到很多问题,比如:我要租房子,但是我不认识房东,怎么办?找中介。同样的道理,我自己不想在修改代码去增加权限检查和日志记录的功能,那么我找一个代理对象去帮我实现不就可以了吗?
动态代理:就是在程序运行过程中产生的这个对象。
在java中java.lang.reflect包下提供了一个proxy类和一个invocationhandler接口,通过使用这个类和接口接可以生成动态代理对象。jdk只针对接口做代理。
proxy类中的方法创建动态代理对象
public static object newproxyinstance(classloader loader,class<?>[] interfaces,invocationhandler h)
最终会调用invocationhandler的方法
object invoke(object proxy,method method,object[] args)
package cn2; public interface iuserdao { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class userdaoimpl implements iuserdao { @override public void login() { system.out.println("用户登录"); } @override public void register() { system.out.println("用户注册"); } } package cn2; 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("权限检查"); object invoke = method.invoke(target, args); system.out.println("日志记录"); return invoke; } } package cn2; import java.lang.reflect.proxy; public class test { public static void main(string[] args) { //使用动态代理之前 iuserdao dao = new userdaoimpl(); dao.register(); dao.login(); system.out.println("-------------------"); //使用动态代理之后 iuserdao proxy = (iuserdao)proxy.newproxyinstance(dao.getclass().getclassloader(), dao.getclass().getinterfaces(), new myinvocationhandler(dao)); proxy.register(); proxy.login(); } }
用户注册
用户登录
-------------------
权限检查
用户注册
日志记录
权限检查
用户登录
日志记录
其它类似信息

推荐信息