`
兩ting
  • 浏览: 78097 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

JDK_Proxy_InvocationHandler_动态代理

阅读更多
本文用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动态代理_JDK动态代理

    JDK动态代理的核心API包括`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。 - **`java.lang.reflect.Proxy`**:提供了创建动态代理类和实例的方法。通过`newProxyInstance`方法,传入...

    JDK_API_1_6_zh_CN.CHM

    4. **动态代理(Dynamic Proxies)**:`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口提供了创建动态代理对象的能力,方便实现接口的动态回调。 5. **NIO.2(New I/O)**:JDK 1.6引入了...

    JDK_API_1_6_zh_CN.chm

    5. **动态代理**:java.lang.reflect包中的Proxy类和InvocationHandler接口使得动态创建代理对象变得更加容易,便于实现AOP(面向切面编程)或其他拦截器模式。 6. **改进的内存管理**:JVM的垃圾收集机制得到优化...

    JDK_API_1.8及1.6 中文版

    3. **动态代理**:通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现了动态创建代理对象的功能。 4. **改进的I/O**:NIO(非阻塞I/O)的引入,提供了更高效的数据传输方式。 5. **JDBC ...

    JDK动态代理proxy

    JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...

    Spring_0300_JDKProxy

    标题"Spring_0300_JDKProxy"暗示我们将讨论Spring如何使用JDK的Proxy类来实现动态代理。在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以...

    浅谈JDK动态代理与CGLIB代理去区别

    首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象,而InvocationHandler接口则定义了处理代理对象调用方法的逻辑。当调用代理对象的...

    关于jdk动态代理的源码剖析

    `Proxy`类是JDK中专门用于生成动态代理类的工具类。它提供了一系列静态方法来帮助我们生成代理对象。 1. **`ProxyGenerator`的作用**:`ProxyGenerator`是一个辅助工具类,用于生成代理类的字节码文件。我们可以...

    JDK_API_1_6_zh_CN_downcc.com.zip

    Java 1.6通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`支持动态代理,可以在运行时创建符合特定接口的新类。 6. **NIO(非阻塞I/O)**: 引入`java.nio`包,提供了基于通道(Channel)...

    JDK_API_1_6_zh_CN.chm帮助文档

    4. **动态代理**:Java 1.6引入了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,允许在运行时创建动态代理对象,实现接口的动态方法调用。 5. **NIO.2**:新增`java.nio.file`包,提供...

    jdk动态代理技术详解

    Proxy 类是 JDK 中的动态代理类,是动态代理的核心类,其作用类似于代理模式中的代理。Proxy 类中包含的全是静态的方法和成员变量,这是一个纯粹的工具类,因此其源代码中含有一个私有的构造器,在某种意义上可以看...

    java代理机制 JDK动态代理和cglib代理 详解

    - `InvocationHandler`是JDK动态代理的核心,它定义了一个invoke()方法,该方法会在代理类调用目标方法时被触发。 - 我们需要实现`InvocationHandler`接口,重写invoke()方法,当调用代理对象的方法时,实际执行的...

    JDK_API_1.6中文版

    - 动态代理通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口实现,可以在运行时创建接口的代理对象,实现动态调用处理。 6. **注解** - JDK 1.6引入了注解(Annotation),这是一种元...

    JDK动态代理在EJB3(包括WebService)中的应用

    在Java中,动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,该对象可以作为一个接口的实例,而InvocationHandler接口定义了一个方法,即...

    JDK_API 6 帮助文档chm

    2. **动态代理(Dynamic Proxies)**:提供了`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,可以方便地创建符合特定接口的动态代理对象,用于实现AOP(面向切面编程)等高级功能。 3. **NIO....

    JDK_API_1_6_中文

    4. **动态代理**:`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,允许创建动态实现接口的代理类,增强了设计模式中的代理模式的实现。 5. **NIO.2**:Java 7引入了NIO.2,但在1.6中...

    JDK动态代理简单示例

    在Java中,动态代理是通过java.lang.reflect包下的两个类实现的:Proxy和InvocationHandler。Proxy类用于创建代理对象,而InvocationHandler接口则定义了处理代理对象方法调用的逻辑。 1. **Proxy类**: - Proxy类...

    JDK_API_1_6_zh_CN

    8. **动态代理**:Java.lang.reflect包中的Proxy类和InvocationHandler接口,使得开发者可以在运行时创建动态代理类,实现对接口方法的拦截和自定义行为。 9. **泛型**:自JDK 5引入以来,泛型在1.6版本中得到了...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类是生成代理对象的工厂,而InvocationHandler接口定义了调用处理程序的接口,用于处理对代理对象的方法调用...

    JDK动态代理源码

    1. **Java.lang.reflect.Proxy**:这是JDK动态代理的关键类,它提供了创建动态代理对象的工厂方法`newProxyInstance()`。这个方法接收三个参数:`ClassLoader`用于加载代理类,`Interface[]`表示代理对象需要实现的...

Global site tag (gtag.js) - Google Analytics