本文用jdk动态代理模拟了spring的AOP的实现技术
AOP面向切面编程,可用于权限验证,效率检查,事务,异常管理等
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中 InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一 起。
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例
UserDAOImpl.java
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user saved!");
}
public void delete() {
System.out.println("user deteleted");
}
}
LogInterceptor.java//处理程序必须实现InvocationHandler接口
public class LogInterceptor implements InvocationHandler {
private Object target; //被代理的对象
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void beforeMethod(Method m) {
System.out.println(m.getName() + " start");
}
/* proxy是代理实例,一般不会用到;method是代理实例上的方法,通过它可以发起对目标类的反射调用;
* args是通过代理类传入 的方法参数,在反射调用时使用
* */
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
}
UserServiceTest.java
public void testProxy() {
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor(); //创建一个Handerler对象
li.setTarget(userDAO); //将Handler对象和被代理对象关联
/*newProxyInstance参数含义
* 第一个参数:代理的类加载器,必须和被代理的对象是一个类加载器
* 第二个参数含义:代理对象要实现的那些接口
* 第三个参数:指派方法调用的调用处理程序
* */
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
System.out.println(userDAO.getClass().getInterfaces().getClass());
System.out.println(userDAOProxy.getClass().getInterfaces()[0]);
userDAOProxy.delete();
userDAOProxy.save(new User());
}
运行结果:
interface com.bjsxt.dao.UserDAO
delete start
user deteleted
save start
user saved!
分享到:
相关推荐
JDK动态代理的核心API包括`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。 - **`java.lang.reflect.Proxy`**:提供了创建动态代理类和实例的方法。通过`newProxyInstance`方法,传入...
4. **动态代理(Dynamic Proxies)**:`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了创建动态代理对象的能力,方便实现接口的动态回调。 5. **NIO.2(New I/O)**:JDK 1.6引入了...
5. **动态代理**:java.lang.reflect包中的Proxy类和InvocationHandler接口使得动态创建代理对象变得更加容易,便于实现AOP(面向切面编程)或其他拦截器模式。 6. **改进的内存管理**:JVM的垃圾收集机制得到优化...
3. **动态代理**:通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现了动态创建代理对象的功能。 4. **改进的I/O**:NIO(非阻塞I/O)的引入,提供了更高效的数据传输方式。 5. **JDBC ...
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
标题"Spring_0300_JDKProxy"暗示我们将讨论Spring如何使用JDK的Proxy类来实现动态代理。在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以...
首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象,而InvocationHandler接口则定义了处理代理对象调用方法的逻辑。当调用代理对象的...
`Proxy`类是JDK中专门用于生成动态代理类的工具类。它提供了一系列静态方法来帮助我们生成代理对象。 1. **`ProxyGenerator`的作用**:`ProxyGenerator`是一个辅助工具类,用于生成代理类的字节码文件。我们可以...
Java 1.6通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`支持动态代理,可以在运行时创建符合特定接口的新类。 6. **NIO(非阻塞I/O)**: 引入`java.nio`包,提供了基于通道(Channel)...
4. **动态代理**:Java 1.6引入了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,允许在运行时创建动态代理对象,实现接口的动态方法调用。 5. **NIO.2**:新增`java.nio.file`包,提供...
Proxy 类是 JDK 中的动态代理类,是动态代理的核心类,其作用类似于代理模式中的代理。Proxy 类中包含的全是静态的方法和成员变量,这是一个纯粹的工具类,因此其源代码中含有一个私有的构造器,在某种意义上可以看...
- `InvocationHandler`是JDK动态代理的核心,它定义了一个invoke()方法,该方法会在代理类调用目标方法时被触发。 - 我们需要实现`InvocationHandler`接口,重写invoke()方法,当调用代理对象的方法时,实际执行的...
- 动态代理通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口实现,可以在运行时创建接口的代理对象,实现动态调用处理。 6. **注解** - JDK 1.6引入了注解(Annotation),这是一种元...
在Java中,动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,该对象可以作为一个接口的实例,而InvocationHandler接口定义了一个方法,即...
2. **动态代理(Dynamic Proxies)**:提供了`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,可以方便地创建符合特定接口的动态代理对象,用于实现AOP(面向切面编程)等高级功能。 3. **NIO....
4. **动态代理**:`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,允许创建动态实现接口的代理类,增强了设计模式中的代理模式的实现。 5. **NIO.2**:Java 7引入了NIO.2,但在1.6中...
在Java中,动态代理是通过java.lang.reflect包下的两个类实现的:Proxy和InvocationHandler。Proxy类用于创建代理对象,而InvocationHandler接口则定义了处理代理对象方法调用的逻辑。 1. **Proxy类**: - Proxy类...
8. **动态代理**:Java.lang.reflect包中的Proxy类和InvocationHandler接口,使得开发者可以在运行时创建动态代理类,实现对接口方法的拦截和自定义行为。 9. **泛型**:自JDK 5引入以来,泛型在1.6版本中得到了...
JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类是生成代理对象的工厂,而InvocationHandler接口定义了调用处理程序的接口,用于处理对代理对象的方法调用...
1. **Java.lang.reflect.Proxy**:这是JDK动态代理的关键类,它提供了创建动态代理对象的工厂方法`newProxyInstance()`。这个方法接收三个参数:`ClassLoader`用于加载代理类,`Interface[]`表示代理对象需要实现的...