`
kukuzidian
  • 浏览: 21985 次
  • 来自: 北京
社区版块
存档分类
最新评论

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();

}

 

}

 

 

 

 

分享到:
评论

相关推荐

    静态代理 动态代理 jdk Proxy

    自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { super(); ...

    两万字吐血总结,代理模式及手写实现动态代理(aop原理,基于jdk动态代理)

    熟悉代理模式的可以直接点击目录第二章,jdk动态代理实现原理,本文的精髓所在,通过这个例子,教大家如何去学习源码。 1. 定义 代理模式(Proxy Pattern) 是一个使用频率非常高的设计模式,其定义如下: Provide a ...

    JAVA的反射机制与动态代理.pdf

    那个最近想看看Spring AOP的动态代理到底是个咋回事,特地学习了一下,写了个文档。 本文档先讲解了JDK的反射机制,然后是Proxy的动态代理、CGLIB的动态代理,因为这些是Spring AOP的底层技术,清楚了它们,你就更...

    Learn-understand-plugin-framework:学习understand-plugin-framework

    静态代理和动态代理(jdk动态代理),以及使用代理模式hook系统的startActivity(...),这块还涉及到反射的使用.使用的是一个现实生活中找代理买东西的例子1 . 静态代理,可以理解为我们没有时间自己亲自去买东西,于是...

    SpringbootBySelf:springboot尚硅谷学习笔记以及文档代码

    Springboot springboot学习笔记以及文档代码 Springboot2.0里面 文件夹对应内容 ...设计了一个 rest响应的服务器请求, 框架 里面涉及到的知识点 JDK动态代理,Factory 的使用以及Spring提供的webclient的使用等

    proxy-test.zip

    这是一个demo,里面包含静态包含和动态包含的例子 使用这个demo进行不断调试,查看JDk内部代码,了解代理内部原理 参考这篇文章学习更轻松:https://blog.csdn.net/qq_42276808/article/details/110495122

    java 实现AOP

     JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被...

    leetcode分类-Java-grammar1:java学习资料,使用技巧,各方面应用,基于jdk1.8.151版本之前的总结,各个版本更改

    leetcode 分类 Java-grammar 例子都采用java1.8.151 ...代理模式。行为型模式的策略模式。 2018.08.08 更新设计模式 单例,工厂,建造者模式 2018.05.05 更新java socket的10大参数和serversocket的一个阻塞参数.对10

    详解Observer Pattern(观察者模式)在Java中的使用原理

    对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...

    疯狂JAVA讲义

    学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种...

    Hibernate中文详细学习文档

    5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent ...

    Maven权威指南 很精典的学习教程,比ANT更好用

    下载本章的例子 3.2. 创建一个简单的项目 3.3. 构建一个简单的项目 3.4. 简单的项目对象模型 (Project Object Model) 3.5. 核心概念 3.5.1. Maven插件和目标 (Plugins and Goals) 3.5.2. Maven生命周期 ...

    java后端源码部署-JavaTutorial:Java教程:基础、中级、高级;常用的工具和Servlet容器使用说明

    注:部分例子基于JDK8。 关键字 数据结构 定时器 数据库 XML 序列化与反序列化 Gson 单元测试 EasyMock WireMock Mockito 网络&I/O RMI HTTP Netty 4.0.x 线程&并发 反射&代理 AOP 脚本语言 加密解密 开源组件 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例161 反射与动态代理 209 7.3 常见的未检查型异常 210 实例162 算数异常 210 实例163 数组存值异常 211 实例164 数组下标越界异常 212 实例165 空指针异常 213 7.4 常见的已检查型异常 214 实例166 类未发现异常 ...

    Java 高级特性.doc

    这个是JDK 增加的新特性的用法! public static void loop(int x,int... args ) { //这里的参数一定要以这样的形式输入 for(int i:args) { System.out.println(i); } } 3.枚举 写枚举技巧: 1. enum Gender{...

    Nginx+Tomcat负载均衡

    注:本例程以一台win7机器为例子,即同一台机器上装一个nginx和2个Tomcat。 且安装了JDK。 便于管理将用到的资料放在一个文件夹下 我在D盘 创建 server 文件夹 . 1. Nginx 下载直接解压缩到server,点nginx....

    新版Android开发教程.rar

    o JDK 5 or JDK 6 (JRE alone is not sufficient) o Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows o Not Not Not Not compatible with Gnu Compiler for Java (gcj) Note: Note: Note: ...

Global site tag (gtag.js) - Google Analytics