`
labile
  • 浏览: 43154 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

用 java.lang.reflect.Proxy 制作类似AOP 的方法调用 Log 层

阅读更多
java.lang.reflect.Proxy 制作类似AOP 的方法调用 Log 层
 
个人认为,java.lang.reflect.Proxy 简直是懒人必备的工具。
 
如,我负责编写一个分布式系统的一个服务,别的应用要调用我的服务的 RMI接口方法。而多人开发有着一个必然的缺点:每人负责的模块均对外提供接口,但事情往往会因为接口的定义者、实现者、使用者间对接口理解的偏差,而在软件的开发中引出不少麻烦。于是,接口调用日志就有作用了。特别是 RMI Interface 的日志。
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.text.MessageFormat;
import java.util.Arrays;
 
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
 
 
/**
 *Afactoryofmethodinvokeloginterceptor.
 *logtheinvokeparamandresult.
 *@param<TargetInterface>
 */
publicclass InvokeLogProxyFactory<TargetInterface> {
   
    publicclass MyInvocationHandler implements InvocationHandler {
      
       private Level logLevel;
      
       private TargetInterface impl;
      
       public MyInvocationHandler(Level logLevel, TargetInterface impl) {
           this.logLevel = logLevel;
           this.impl = impl;
       }
 
       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
           final Logger log = Logger.getLogger( impl.getClass() );
           String msg = MessageFormat.format( "Calling method {0}({1})", method.getName(), Arrays.toString( args ) );
           log.log( logLevel, msg );
           Object returnedResult = null;
           try {
               returnedResult = method.invoke( impl, args );
           } catch ( InvocationTargetException e ) {
              String msg1 = MessageFormat.format( "Call method[{0}]: catch exceptions:", method.getName() );
              log.log( logLevel, msg1, e.getCause() );
              throw e.getCause();
           } catch( Throwable e ) {
              log.error( "Runtime exception:", e );
              throw e;
           }
           log.log( logLevel, "returned val=" + returnedResult );
           return returnedResult;
       }
    }
   
    @SuppressWarnings("unchecked")
    public TargetInterface create(TargetInterface impl, Level logLevel) {
       MyInvocationHandler handler = new MyInvocationHandler( logLevel, impl);
         Object result = Proxy.newProxyInstance(impl.getClass().getClassLoader(),
                 impl.getClass().getInterfaces(),
                 handler);
         return (TargetInterface) result;     
    }
   
}
 
 
 

分享到:
评论

相关推荐

    java反射(reflect)

    1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...

    用Java动态代理实现AOP

    在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想是将日志记录、性能统计、安全控制、事务处理等方面的代码从商业逻辑代码中分离出来,以提高...

    java反射与代理实现AOP

    - `java.lang.reflect.Proxy`: 提供了创建代理对象的方法。 具体实现步骤如下: 1. **定义一个接口**:定义一个接口,让所有业务逻辑类都实现该接口。 2. **创建代理对象**:使用`Proxy.newProxyInstance()`方法...

    665.663.JAVA基础教程_动态代理与Java8新特性-AOP与动态代理的举例(665).rar

    Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是实现动态代理的核心组件。 2. 创建动态代理 要创建动态代理,首先需要定义一个或多个接口,然后创建一个实现`InvocationHandler`...

    java 实现AOP

    程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用...

    详解面向切面编程

    1. **基于接口的Java内置动态代理**:使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。这种方式要求被代理的对象必须实现至少一个接口。以下是一个简单的例子: - 定义业务接口`...

    从一个输出日志的实例分析Java的代理机制.doc

    动态代理则是在运行时动态生成代理对象,这通常通过Java的`java.lang.reflect.Proxy`类和`InvocationHandler`接口来实现。在动态代理中,我们定义一个`InvocationHandler`实现类,重写`invoke`方法,在这个方法内...

    AOP编程入门

    - **基于接口的代理**:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口,适用于实现了接口的对象。 - **基于类的代理**:使用第三方库如CGLIB,适用于需要代理没有实现接口的类。 这两...

    TestDynamicProxy.zip

    动态代理的核心在于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建动态代理实例,而InvocationHandler接口定义了处理方法调用的逻辑。 首先,我们需要定义一个...

    AOP的实现机制.pdf

    Java中的动态代理(java.lang.reflect.Proxy)和C#中的接口代理是典型的代理模式实现。 - **字节码操作**:更底层的实现方式,如AspectJ和ASM库,它们在类加载到JVM之前修改字节码,直接在运行时织入切面。这种方式...

    proxy增加日志例子

    1. JDK动态代理:当目标类实现了至少一个接口时,Spring会使用Java的`java.lang.reflect.Proxy`类来创建代理。这个代理类会实现目标类的所有接口,并在调用每个方法时插入拦截器(如日志记录)的逻辑。 2. CGLIB...

    利用动态代理提炼Servlet

    动态代理,是Java提供的一种运行时创建代理对象的技术,主要由java.lang.reflect包下的Proxy和InvocationHandler两个类实现。动态代理可以帮助我们在不修改原有代码的基础上,为已有的接口添加额外的功能,如日志...

    Spring AOP 概念理解及@AspectJ支持

    Spring AOP的实现基于动态代理,对于接口实现类,它使用Java的`java.lang.reflect.Proxy`类来创建代理对象;对于没有接口的类,Spring使用CGLIB库生成子类。在运行时,Spring AOP会根据切面定义生成代理对象,然后...

    Java 动态代理详解(学习资料)

    JDK 动态代理JDK 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来支持动态代理。Proxy 类用于创建一个代理对象,而 InvocationHandler 接口则定义了代理对象的方法调用处理逻辑。...

    java代理模式

    Java提供了一种实现动态代理的方式,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。通过`Proxy.newProxyInstance()`方法,我们可以创建一个代理对象,这个对象可以代表任何实现了特定...

    spring-demo16-JDK动态代理.zip

    JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。首先,我们需要一个接口,这个接口定义了我们想要代理的方法。例如,我们可以创建一个名为`Service`的接口,...

    spring+动态代理

    动态代理的核心概念是JDK的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。Spring框架提供了...

    以注解方式模拟Spring_IoC,AOP

    在没有Spring的情况下,我们可以使用简单的工厂模式或反射机制来模拟IoC,用代理模式或动态代理(如Java的`java.lang.reflect.Proxy`)来模拟AOP。这通常涉及到创建一个容器(类似Spring的ApplicationContext),...

    spring学习笔记(七)

    在Java中,可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Spring使用CGLIB库或JDK的动态代理来创建AOP代理。当目标对象实现了一个或多个接口时,JDK动态代理会被使用;若...

Global site tag (gtag.js) - Google Analytics