`
zzg
  • 浏览: 124863 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

动态代理类(Proxy)

    博客分类:
  • AOP
阅读更多
使用一个动态代理类(Proxy),通过拦截一个对象的行为并添加我们需要的功能来完成。Java中的java.lang.reflect.Proxy类 和java.lang.reflect.InvocationHandler接口为我们实现动态代理类提供了一个方案,但是该方案针对的对象要实现某些接 口;如果针对的目的是类的话,cglib为我们提供了另外一个实现方案。

一、接口的实现方案:

java 代码
 
  1. public interface StudentInfoService{  
  2.  void findInfo(String studentName);  
  3. }  
  4.  
  5. public class StudentInfoServiceImpl implements StudentInfoService{  
  6.  public void findInfo(String name){  
  7.   System.out.println("你目前输入的名字是:"+name);  
  8.  }  
  9. }
  10.   
  11. import org.apache.log4j.Logger;  
  12. import java.lang.reflect.InvocationHandler;  
  13. import java.lang.reflect.Proxy;  
  14. import java.lang.reflect.Method;  
  15.   
  16. public class MyHandler implements InvocationHandler{  
  17.  private Object proxyObj;  
  18.  private static Logger log=Logger.getLogger(MyHandler.class);  
  19.    
  20.  public Object bind(Object obj){  
  21.   this.proxyObj=obj;  
  22.   return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);  
  23.  }  
  24.    
  25.  public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{  
  26.   Object result=null;  
  27.   try{  
  28.    //请在这里插入代码,在方法前调用  
  29.    log.info("调用log日志方法"+method.getName());  
  30.    result=method.invoke(proxyObj,args); //原方法  
  31.    //请在这里插入代码,方法后调用  
  32.   }catch(Exception e){  
  33.    e.printStackTrace();  
  34.   }  
  35.   return result;  
  36.  }  
  37. }  


实现一个工厂,为了方便我们使用该拦截类(AOPFactory.java):

java 代码
 
  1. public class AOPFactory{  
  2.  private static Object getClassInstance(String clzName){  
  3.   Object obj=null;  
  4.   try{  
  5.    Class cls=Class.forName(clzName);  
  6.    obj=(Object)cls.newInstance();  
  7.   }catch(ClassNotFoundException cnfe){  
  8.    System.out.println("ClassNotFoundException:"+cnfe.getMessage());  
  9.   }catch(Exception e){  
  10.    e.printStackTrace();  
  11.   }  
  12.   return obj;  
  13.  }  
  14.    
  15.  public static Object getAOPProxyedObject(String clzName){  
  16.   Object proxy=null;  
  17.   MyHandler handler=new MyHandler();  
  18.   Object obj=getClassInstance(clzName);  
  19.   if(obj!=null) {  
  20.    proxy=handler.bind(obj);  
  21.   }else{  
  22.    System.out.println("Can't get the proxyobj");  
  23.    //throw  
  24.   }  
  25.   return proxy;  
  26.  }  
  27. }  

使用该工厂类

java 代码
 
  1. public class ClientTest{  
  2.  public static void main(String[] args){  
  3.   StudentInfoService studentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");  
  4.   studentInfo.findInfo("阿飞");  
  5.  }  
  6. }  
分享到:
评论

相关推荐

    动态代理类例子proxy

    动态代理类例子proxy动态代理类例子proxy动态代理类例子proxy

    Java动态代理[动态类Proxy的使用]

    首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写具体实现。这个新创建的代理类在运行时动态生成,并且在调用接口方法时,可以插入...

    Java动态代理实现 Proxy InvocationHandler

    `Proxy`类是Java动态代理的核心,它提供了生成代理类和实例的静态方法。生成的代理类会实现目标类所实现的所有接口。`Proxy`类的主要方法有: - `Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, ...

    jdbc proxy 代理类

    【标题】:“JDBC Proxy 代理类” 在Java开发中,JDBC(Java Database Connectivity)是连接数据库的主要方式。然而,直接使用JDBC代码往往繁琐且易出错,因此引入了代理类(Proxy Class)的概念,它能为JDBC提供更...

    java Proxy 动态代理

    在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...

    JDK动态代理proxy

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

    面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?

    在Java的动态代理机制中,JDK生成的代理类之所以要继承`Proxy`类,是因为`Proxy`类提供了实现动态代理所需的核心功能。面试官的问题实际上涉及到Java动态代理的实现原理,下面我们将深入探讨这个问题。 首先,我们...

    java proxy demo 代理类的运用demo

    静态代理是在编译时就已经确定代理类的实现,而动态代理则是在运行时根据接口生成代理类。我们这里主要讨论的是动态代理,它基于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 ...

    代理模式java代码 Proxy(5) 2个代理类

    在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...

    AOP的动态代理proxy

    总结起来,Java中的动态代理是AOP的一种实现方式,它利用`InvocationHandler`接口创建一个代理类,这个代理类可以在调用目标方法前后添加额外的功能,而无需修改目标类的源代码。这种机制在日志、事务管理、性能监控...

    java 简答可复用动态代理类

    - `Proxy`类是Java提供的动态代理的工厂,它可以根据一个接口生成实现了该接口的代理类的对象。这个代理类会动态地生成并实现接口的所有方法。 - `InvocationHandler`接口定义了一个处理方法调用的回调方法`invoke...

    Java动态代理语法Proxy类原理详解

    在上面的示例中,我们定义了一个动态代理类DynamicProxy,它实现了InvocationHandler接口。我们可以通过DynamicProxy对象来代理RealSubject对象,并对其方法调用进行处理和修改。 四、结论 Java动态代理语法Proxy...

    Java 动态代理Proxy应用和底层源码分析.pdf

    2. **Proxy**:提供了一系列静态方法来创建动态代理类和实例。 #### 四、Java动态代理示例 ```java interface MyInterface { void doSomething(); } class MyInvocationHandler implements InvocationHandler { ...

    java动态代理类的实例

    在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...

    代理类,详细讲解一下动态代理类

    动态代理类是这种机制的一个变体,尤其适用于运行时生成代理类的情况。接下来,我们将详细讨论动态代理类的概念、其作用以及如何在实际开发中应用。 首先,代理类的主要作用在于提供额外的控制层。当直接调用目标...

    CGLIB 和 JDK生成动态代理类的区别

    首先,JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。JDK动态代理只能为实现了至少一个接口的类生成代理。它的基本原理是利用反射机制生成一个实现了目标接口的...

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

    代理类在运行时由`java.lang.reflect.Proxy`类动态生成,因此称为动态代理。 2. CGLIB代理: 对于没有实现接口的目标对象,Spring会使用CGLIB库来创建代理。CGLIB是一个强大的高性能的代码生成库,它可以在运行期...

    day03 代理+适配器+桥接+外观+装饰

    Java中提供了一个动态代理类Proxy,Proxy并不是我们上述所说的代理对象的类,而是提供了一个创建代理对象的静态方法(newProxyInstance方法)来获取代理对象。 适配器模式是一种结构型模式,用于解决两个不兼容的...

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

    动态代理,如JDK动态代理,提供了一种在运行时动态创建代理对象的能力,无需预先编写代理类。在Java中,我们可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于...

    Java动态代理Proxy和cglib

    Java的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。这个主题将深入探讨这两个关键组件以及与之相关的CGLIB库。 ### 1. Java动态代理 #### 1.1 Proxy类 `Proxy`...

Global site tag (gtag.js) - Google Analytics