最新在学习拦截器原理,网上查询资料说拦截器都是基于动态代理实现。
在网上学习动态代理后,自己写了个小例子,简单权限过滤,基于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内置动态代理例子”旨在演示如何利用Java的反射API和`java.lang.reflect.Proxy`类来实现类似拦截器的功能。下面我们将深入探讨相关知识点。 首先,动态代理的核心在于`java.lang.reflect.Proxy`类。这个类...
虽然它不如第三方AOP框架功能强大,但在特定场景下,如轻量级应用或者学习AOP原理时,JDK动态代理是一个非常实用的工具。了解并熟练掌握这个特性对于提升Java开发技能和理解面向切面编程的概念至关重要。
通过学习这个简单的例子,我们可以更好地理解Spring动态代理的概念,以及如何在实际项目中应用它来实现AOP功能,比如日志记录、事务管理、性能监控等。实践出真知,建议亲自运行此示例,通过调试和查看代码运行流程...
Spring AOP提供了两种动态代理方式:JDK代理和CGLIB代理。选择哪种代理方式取决于目标对象是否实现了接口。 1. JDK代理:如果目标对象实现了至少一个接口,Spring AOP会使用JDK的动态代理机制。在这种情况下,...
自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { super(); ...
在Java开发中,JDK和CGLib是两种常见的实现动态代理的技术,它们允许我们在运行时创建对象的代理,以增强或拦截对象的方法...对于深入学习,可以参考提供的博文链接以及进一步研究CGLib和JDK动态代理的相关文档和源码。
Spring AOP提供了两种动态代理方式:JDK动态代理和CGLIB代理。前者基于接口,如果目标类实现了接口,Spring会使用JDK的动态代理;如果没有,Spring会转而使用CGLIB生成一个目标类的子类来实现代理。 总结来说,动态...
2. 动态代理:JDK提供了一种动态代理机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理在运行时生成代理类,可以更加灵活地处理代理关系,减少了代码维护的工作量...
- **动态代理**:允许在运行时创建实现一组给定接口的新类。 - **增强的for循环**(foreach):简化了遍历数组和集合的操作。 - **try-catch-finally增强**:可以捕获多个异常,且finally块可以有返回值。 - **...
但是,由于涉及到字节码生成,其代码比JDK代理复杂。 在提供的资源中,你将找到三个目录,分别对应上述三种代理模式: - **jdkProxy**:这个目录包含了使用JDK动态代理的例子。你可以看到一个或多个接口,一个实现...
总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...
接下来,我们将分别介绍 JDK 动态代理、CGLIB 动态代理、Javassist 代理以及 ASM 代理。 ### JDK 动态代理 JDK 动态代理主要依赖于 `java.lang.reflect.Proxy` 类和 `java.lang.reflect.InvocationHandler` 接口。...
Java动态代理基于JDK的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类用于创建代理类实例,而`InvocationHandler`接口定义了处理代理对象的方法调用的逻辑。 ### 2. 创建代理...
在给定的学习笔记中提供了一个具体的JDK动态代理实现例子,包括以下几个关键部分: 1. **AspectInvocationHandler类**:实现了`InvocationHandler`接口,用于处理代理对象的方法调用。 - **构造函数**:接收目标...
在"DynamicProxy"目录下的源码中,可以看到如何使用这些类和接口创建并操作动态代理的例子。 3. 接口代理(JDK动态代理): 接口代理是基于Java的反射机制实现的动态代理,适用于目标对象实现了接口的情况。在...
2. **第三章_proxy-demo.zip**:这个例子可能展示了如何创建和使用动态代理。你可能会看到如何通过Spring AOP自定义代理类,以及如何利用JDK动态代理和CGLIB来拦截并增强方法的执行。 3. **第六章_cache-demo.zip**...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理...Cglib代理则可以代理任何类,但需要引入额外的库,且相对于JDK代理,其代码稍微复杂一些。在实际应用中,根据项目需求选择适合的代理实现。
【描述】中的"JDK动态代理例子"指的是使用Java的Proxy类和InvocationHandler接口来实现的动态代理机制。这个项目提供了具体的代码示例,展示了如何通过这两个核心组件创建代理类,并在不修改原有代码的基础上,为已...
2. **动态代理**:JDK6引入了Java.lang.reflect.Proxy类,可以方便地创建动态代理对象,用于实现AOP(面向切面编程)或者为接口提供默认实现。 3. **改进的Swing**:Swing UI库在JDK6中得到了加强,提供了更丰富的...