jdk动态代理学习例子

 

最新在学习拦截器原理,网上查询资料说拦截器都是基于动态代理实现。

在网上学习动态代理后,自己写了个小例子,简单权限过滤,基于JDK动态代理实现。

贴出来搭建一起学习交流。

 

目标抽象接口:

public interface DbOperator {

 

public void add();

public void query();

public void update();

public void delete();

}

 

目标对象

public class User implements DbOperator {

private String name;

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public User(String name){

this.name = name;

}

 

@Override

public void add() {

// TODO Auto-generated method stub

System.out.println(name+"添加");

}

 

@Override

public void query() {

System.out.println(name+"查询");

}

 

@Override

public void update() {

// TODO Auto-generated method stub

System.out.println(name+"更新");

}

 

@Override

public void delete() {

// TODO Auto-generated method stub

System.out.println(name+"删除");

}

 

}

 

 

目标处理Handle:

public class UserHandle implements InvocationHandler {

//目标对象

Object targetObj;

//拦截器类(权限检查)

Aspect aspect;

public UserHandle(Object targetObj,Aspect aspect){

this.targetObj = targetObj;

this.aspect  = aspect;

}

 

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

// TODO Auto-generated method stub

Object value = null;

boolean flag = aspect.before(((User)targetObj).getName() , method.getName());

//根据用户权限检查结果,判断用户是否有权限调用方法

if(flag){

value = method.invoke(targetObj, args);

}

aspect.after();

return value;

}

 

}

 

 

拦截器接口

public interface Aspect {

 

public boolean before(String userName,String methodName);

public void after();

}

 

拦截器实现

public class AspectImplOne implements Aspect {

 

@Override

public boolean before(String userName , String methodName) {

// TODO Auto-generated method stub

boolean flag = true;

System.out.println("********权限检查  before");

if(methodName.equals("query") || userName.equals("lisi") && (methodName.equals("update") || methodName.equals("add") || methodName.equals("delete"))){

}else{

System.out.println("警告:"+userName+"没有权限 "+methodName);

flag = false;

}

return flag;

}

 

@Override

public void after() {

// TODO Auto-generated method stub

System.out.println("********权限检查 after");

}

 

}

 

 

代理工厂

public class DynamicProxyFactory {

/**

* @param dbOperator 被代理对象(目标对象)

* @param userHandle  用户处理器

* @return 代理对象

*/

public static Object getProxy(DbOperator dbOperator,UserHandle userHandle){

return Proxy.newProxyInstance(dbOperator.getClass().getClassLoader(), dbOperator.getClass().getInterfaces(), userHandle);

}

 

}

 

 

动态代理测试

 

public class DynamicProxy {

 

/**

* @param args

*/

public static void main(String[] args) {

//创建目标对象

DbOperator zhangsan = new User("zhangsan");

DbOperator lisi = new User("lisi");

//创建权限检查对象

Aspect aspect = new AspectImplOne();

//生成代理对象

DbOperator proxy1 = (DbOperator)DynamicProxyFactory.getProxy(zhangsan, new UserHandle(zhangsan,aspect));

DbOperator proxy2 = (DbOperator)DynamicProxyFactory.getProxy(lisi, new UserHandle(lisi,aspect));

//通过代理调用目标方法

proxy1.query();

proxy1.add();

proxy1.update();

proxy1.delete();

proxy2.query();

proxy2.add();

proxy2.update();

proxy2.delete();

}

 

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值