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

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内置动态代理例子

    这个“JDK内置动态代理例子”旨在演示如何利用Java的反射API和`java.lang.reflect.Proxy`类来实现类似拦截器的功能。下面我们将深入探讨相关知识点。 首先,动态代理的核心在于`java.lang.reflect.Proxy`类。这个类...

    JDK动态代理的代码组织与AOP

    虽然它不如第三方AOP框架功能强大,但在特定场景下,如轻量级应用或者学习AOP原理时,JDK动态代理是一个非常实用的工具。了解并熟练掌握这个特性对于提升Java开发技能和理解面向切面编程的概念至关重要。

    spring动态代理类的示范小版本,很简单的例子

    通过学习这个简单的例子,我们可以更好地理解Spring动态代理的概念,以及如何在实际项目中应用它来实现AOP功能,比如日志记录、事务管理、性能监控等。实践出真知,建议亲自运行此示例,通过调试和查看代码运行流程...

    springboot中的 动态代理的选择测试代码

    Spring AOP提供了两种动态代理方式:JDK代理和CGLIB代理。选择哪种代理方式取决于目标对象是否实现了接口。 1. JDK代理:如果目标对象实现了至少一个接口,Spring AOP会使用JDK的动态代理机制。在这种情况下,...

    静态代理 动态代理 jdk Proxy

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

    JDK、CGLib动态代理

    在Java开发中,JDK和CGLib是两种常见的实现动态代理的技术,它们允许我们在运行时创建对象的代理,以增强或拦截对象的方法...对于深入学习,可以参考提供的博文链接以及进一步研究CGLib和JDK动态代理的相关文档和源码。

    动态代理和工厂方法例子

    Spring AOP提供了两种动态代理方式:JDK动态代理和CGLIB代理。前者基于接口,如果目标类实现了接口,Spring会使用JDK的动态代理;如果没有,Spring会转而使用CGLIB生成一个目标类的子类来实现代理。 总结来说,动态...

    Java设计模式-代理模式例子

    2. 动态代理:JDK提供了一种动态代理机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理在运行时生成代理类,可以更加灵活地处理代理关系,减少了代码维护的工作量...

    JAVA JDK6学习笔记

    - **动态代理**:允许在运行时创建实现一组给定接口的新类。 - **增强的for循环**(foreach):简化了遍历数组和集合的操作。 - **try-catch-finally增强**:可以捕获多个异常,且finally块可以有返回值。 - **...

    java中的三种代理模式

    但是,由于涉及到字节码生成,其代码比JDK代理复杂。 在提供的资源中,你将找到三个目录,分别对应上述三种代理模式: - **jdkProxy**:这个目录包含了使用JDK动态代理的例子。你可以看到一个或多个接口,一个实现...

    静态代理和动态代理Demo

    总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...

    Java 动态代理.md

    接下来,我们将分别介绍 JDK 动态代理、CGLIB 动态代理、Javassist 代理以及 ASM 代理。 ### JDK 动态代理 JDK 动态代理主要依赖于 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口。...

    Java动态代理案例演示代码

    Java动态代理基于JDK的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类用于创建代理类实例,而`InvocationHandler`接口定义了处理代理对象的方法调用的逻辑。 ### 2. 创建代理...

    Spring编程学习笔记

    在给定的学习笔记中提供了一个具体的JDK动态代理实现例子,包括以下几个关键部分: 1. **AspectInvocationHandler类**:实现了`InvocationHandler`接口,用于处理代理对象的方法调用。 - **构造函数**:接收目标...

    proxy.rar java三种代理模式源码

    在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    2. **第三章_proxy-demo.zip**:这个例子可能展示了如何创建和使用动态代理。你可能会看到如何通过Spring AOP自定义代理类,以及如何利用JDK动态代理和CGLIB来拦截并增强方法的执行。 3. **第六章_cache-demo.zip**...

    16-Java代理模式的学习笔记1

    Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理...Cglib代理则可以代理任何类,但需要引入额外的库,且相对于JDK代理,其代码稍微复杂一些。在实际应用中,根据项目需求选择适合的代理实现。

    proxy-project.rar

    【描述】中的"JDK动态代理例子"指的是使用Java的Proxy类和InvocationHandler接口来实现的动态代理机制。这个项目提供了具体的代码示例,展示了如何通过这两个核心组件创建代理类,并在不修改原有代码的基础上,为已...

    java学习笔记JDK6课件和课本代码

    2. **动态代理**:JDK6引入了Java.lang.reflect.Proxy类,可以方便地创建动态代理对象,用于实现AOP(面向切面编程)或者为接口提供默认实现。 3. **改进的Swing**:Swing UI库在JDK6中得到了加强,提供了更丰富的...

Global site tag (gtag.js) - Google Analytics