一、动态代理引入
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();
}
}
用户注册
用户登录
-------------------
权限检查
用户注册
日志记录
权限检查
用户登录
日志记录