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; } } |
相关推荐
1. 动态代理:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`可以创建动态代理对象,实现AOP(面向切面编程)。 2. 数据库操作框架:如MyBatis,通过反射动态生成SQL语句并执行。 3. XML...
在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想是将日志记录、性能统计、安全控制、事务处理等方面的代码从商业逻辑代码中分离出来,以提高...
- `java.lang.reflect.Proxy`: 提供了创建代理对象的方法。 具体实现步骤如下: 1. **定义一个接口**:定义一个接口,让所有业务逻辑类都实现该接口。 2. **创建代理对象**:使用`Proxy.newProxyInstance()`方法...
Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是实现动态代理的核心组件。 2. 创建动态代理 要创建动态代理,首先需要定义一个或多个接口,然后创建一个实现`InvocationHandler`...
程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用...
1. **基于接口的Java内置动态代理**:使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。这种方式要求被代理的对象必须实现至少一个接口。以下是一个简单的例子: - 定义业务接口`...
动态代理则是在运行时动态生成代理对象,这通常通过Java的`java.lang.reflect.Proxy`类和`InvocationHandler`接口来实现。在动态代理中,我们定义一个`InvocationHandler`实现类,重写`invoke`方法,在这个方法内...
- **基于接口的代理**:使用`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`接口,适用于实现了接口的对象。 - **基于类的代理**:使用第三方库如CGLIB,适用于需要代理没有实现接口的类。 这两...
动态代理的核心在于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建动态代理实例,而InvocationHandler接口定义了处理方法调用的逻辑。 首先,我们需要定义一个...
Java中的动态代理(java.lang.reflect.Proxy)和C#中的接口代理是典型的代理模式实现。 - **字节码操作**:更底层的实现方式,如AspectJ和ASM库,它们在类加载到JVM之前修改字节码,直接在运行时织入切面。这种方式...
1. JDK动态代理:当目标类实现了至少一个接口时,Spring会使用Java的`java.lang.reflect.Proxy`类来创建代理。这个代理类会实现目标类的所有接口,并在调用每个方法时插入拦截器(如日志记录)的逻辑。 2. CGLIB...
动态代理,是Java提供的一种运行时创建代理对象的技术,主要由java.lang.reflect包下的Proxy和InvocationHandler两个类实现。动态代理可以帮助我们在不修改原有代码的基础上,为已有的接口添加额外的功能,如日志...
Spring AOP的实现基于动态代理,对于接口实现类,它使用Java的`java.lang.reflect.Proxy`类来创建代理对象;对于没有接口的类,Spring使用CGLIB库生成子类。在运行时,Spring AOP会根据切面定义生成代理对象,然后...
JDK 动态代理JDK 提供了 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来支持动态代理。Proxy 类用于创建一个代理对象,而 InvocationHandler 接口则定义了代理对象的方法调用处理逻辑。...
Java提供了一种实现动态代理的方式,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。通过`Proxy.newProxyInstance()`方法,我们可以创建一个代理对象,这个对象可以代表任何实现了特定...
JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。首先,我们需要一个接口,这个接口定义了我们想要代理的方法。例如,我们可以创建一个名为`Service`的接口,...
动态代理的核心概念是JDK的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了处理代理对象方法调用的逻辑。Spring框架提供了...
在没有Spring的情况下,我们可以使用简单的工厂模式或反射机制来模拟IoC,用代理模式或动态代理(如Java的`java.lang.reflect.Proxy`)来模拟AOP。这通常涉及到创建一个容器(类似Spring的ApplicationContext),...
在Java中,可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Spring使用CGLIB库或JDK的动态代理来创建AOP代理。当目标对象实现了一个或多个接口时,JDK动态代理会被使用;若...