1.动态代理的作用
动态代理的作用是实现AOP功能
2.代理实现功能描述
本次演示动态实现功能:为已经具有登录功能的方法增加权限控制
3.动态代理步骤
* 实现动态代理的步骤
1.创建接口,定义目标类要完成功能
2.创建目标类实现接口
3.创建InvocationHandler接口的实现类,在invoke方法中完成要代理类的功能
3.1.调用目标方法
3.2 增强功能
4.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型
4.代码实现
4.1 创建具有登录功能的接口
public interface LoginManager {
boolean login(String username,String password);
}
4.2实现接口方法
//目标类
public class LoginService implements LoginManager {
@Override
public boolean login(String username, String password) {
//登录目标方法,验证用户名和密码是否正确,此处忽略具体的方法
System.out.println("执行目标类目标方法,验证用户名和密码都正确");
//如果用户名密码正确返回true,否则返回false,此处默认用户名密码正确
return true;
}
}
4.3创建InvocationHandler接口实现类
//必须要实现InvocationHandler接口,完成代理类要做的功能(1.调用目标方法,2.增强功能)
public class LoginHandler implements InvocationHandler {
private Object target = null;
//动态代理:目标对象是活动的,不是固定的,需要传入进来
//传入的是谁就给谁创建代理
public LoginHandler(Object target) {
//给目标对象赋值
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = null;
res = method.invoke(target,args);//执行目标方法,即调用目标方法
//以下为增强功能方法
if(res != null){
boolean b = (boolean)res;
//如果b为true,表示用户名密码都在正确,否则表示不正确
//如果用户名密码都正确,则去进行权限验证,否则不进行验证直接返回false
if(b){
//此处进行权限验证的方法,具体方忽略,权限正确返回true,权限错误返回false
System.out.println("判断用户的权限是否有登录权限,发现该用户不具备当前登录的权限");
res = true;
}else{
res = false;
}
}
return res;
}
}
4.4.使用Proxy类的静态方法,创建代理东西,并把返回值转为接口类型
public static void main(String[] args) {
//创建代理对象,使用Proxy
//1.创建目标对象
LoginManager factory = new LoginService();
//2.创建InvocationHandler对象
InvocationHandler handler = new LoginHandler(factory);
//3.创建代理对象
LoginManager proxy = (LoginManager)Proxy.newProxyInstance(factory.getClass().getClassLoader(),
factory.getClass().getInterfaces(),
handler);
//4.通过代理执行方法
boolean b = proxy.login("wensheng","123");
System.out.println(b);
}