import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.dao.impl.PersonDaoImpl;
//当目标类实现了接口,我们可以使用jdk的Proxy来生成代理对象。
public class JDKProxyFactory implements InvocationHandler{
private Object targetObject;
public Object createProxyIntance(Object targetObject){
this.targetObject = targetObject;
/*
* 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器
* 第二个参数设置代理类实现的接口
* 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法
*/
return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
PersonDaoImpl bean = (PersonDaoImpl) this.targetObject;
Object result = null;
if(bean.getUser()!=null){
try {
result = method.invoke(targetObject, args);
} catch (RuntimeException e) {
}finally{
}
}
return result;
}
}
分享到:
相关推荐
下面是一个简单的示例,演示了如何使用JDK动态代理为一个接口创建代理对象,并在方法调用前后添加日志记录功能。 ```java /** * 业务接口 */ public interface IHello { void hello(String name); } /** * ...
使用便利性上,JDK动态代理的API相对简洁,只需要实现InvocationHandler接口并调用Proxy.newProxyInstance()方法即可创建代理对象。而CGLIB的使用稍微复杂一些,需要通过Enhancer类配置回调函数和目标对象,然后调用...
动态代理类是由JDK自动生成的类,它的结构主要包括以下几个方面: 1. **代理类继承自`Proxy`类**:每一个动态代理类都是`Proxy`类的子类,这意味着它们继承了`Proxy`类中的所有属性和方法。 2. **代理类实现了目标...
JDK动态代理的局限性在于,它只能为实现了至少一个接口的类创建代理,因为代理对象必须继承自这些接口。这种方式适用于那些基于接口进行编程的设计,比如Spring AOP中的Advisor和Advice。 相反,CGLIB(Code ...
CGLIB(Code Generation Library)是另一个常用的Java代理库,它不需要目标类实现任何接口,而是通过继承的方式创建代理类。CGLIB使用ASM库在运行时动态生成字节码,创建目标类的子类,从而实现对目标类方法的增强。...
Proxy 类是 JDK 中的动态代理类,是动态代理的核心类,其作用类似于代理模式中的代理。Proxy 类中包含的全是静态的方法和成员变量,这是一个纯粹的工具类,因此其源代码中含有一个私有的构造器,在某种意义上可以看...
2. 创建代理类:使用Proxy类的静态方法`newProxyInstance()`,传入三个参数:目标对象的类加载器、目标对象实现的接口列表以及上一步实现的InvocationHandler实例。这将返回一个新的代理对象,该对象实现了与目标...
3. **不同类,不同方法的代理**:在描述中提到的“不同类,不同方法的代理”意味着JDK动态代理可以为任何实现了相同接口的类创建代理,而不仅仅是单一类。这得益于`InvocationHandler`的灵活性,它可以处理任何接口...
JDK动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理类实例。这种技术在很多场景下都非常有用,比如在AOP(面向切面编程)中实现方法拦截、日志记录、事务管理等。下面我们将深入...
在Java中,动态代理是一种在运行时创建代理类的能力,它允许我们为一组接口创建代理对象,这些代理对象可以拦截并处理方法调用。核心接口是`java.lang.reflect.InvocationHandler`,它定义了处理方法调用的逻辑;另...
- 分析JDK动态代理的源码,可以了解其内部如何生成代理类和调用处理程序的工作机制。 - Spring AOP的源码解析有助于理解其是如何创建代理、匹配切点并执行相应通知的过程。 5. **工具应用**: - JDK动态代理和...
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
总结来说,JDK代理和Cglib代理都是为了在运行时动态创建代理对象,以扩展或修改已有对象的行为。选择哪种方式取决于具体的需求,如目标对象是否实现接口、性能要求、兼容性等因素。在实际开发中,Spring框架就同时...
2. **生成代理对象**: 使用`Proxy.newProxyInstance()`静态方法可以创建代理对象。这个方法需要三个参数:被代理的接口列表、一个`ClassLoader`以及我们的`InvocationHandler`实例。`ClassLoader`用于加载接口的类,...
1. **Proxy类**:这是JDK动态代理的核心类,它提供了`newProxyInstance()`静态方法,用于创建代理对象。 2. **InvocationHandler接口**:每个代理对象都关联一个`InvocationHandler`实例。当代理对象的方法被调用时...
CGLIB使用ASM库来生成和加载代理类的字节码。 使用CGLIB代理通常需要引入cglib库,然后通过`MethodInterceptor`接口和`Enhancer`类来实现。以下是一个CGLIB代理的例子: ```java import ...
在 JDK 动态代理中,我们不需要在编译时创建代理类,而是使用 Java 反射机制在运行时动态创建代理对象。 JDK 动态代理的实现方式是:我们首先需要定义一个接口,然后创建一个实现该接口的类,该类将作为被代理的...
3. 使用`Proxy.newProxyInstance()`方法创建代理对象,传入接口、类加载器和自定义的`InvocationHandler`实例。 4. 通过代理对象调用方法,实际执行逻辑将在`InvocationHandler.invoke()`中进行。 下面是一个简单的...
2. **创建Enhancer对象**:`net.sf.cglib.proxy.Enhancer`是CGLIB的核心类,用于创建代理对象。 3. **设置回调**:使用`setCallback`或`setCallbacks`方法指定回调策略,通常使用`MethodInterceptor`接口,实现`...