注意:JDK只支持接口的动态代理,不支持类的动态代理
先写一个接口,以Dog为例
package com.lbx.dao;
public interface Dog {
public void info();
public void run();
}
Dog接口的实现
package com.lbx.dao.impl;
import com.lbx.dao.Dog;
public class DogImpl implements Dog {
@Override
public void info() {
// TODO Auto-generated method stub
System.out.println("这是一只狗");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("这只狗在RUN");
}
}
目标代理对象需要在方法前后插入的方法
package com.lbx.interceptor;
public class DogInterceptor {
public void method1(){
System.out.println("第一个拦截方法");
}
public void method2(){
System.out.println("第二个拦截方法");
}
}
关键代码(业务处理)
package com.lbx.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
//需要被代理的目标对象
private Object targer;
//创建拦截器的实例
DogInterceptor di = new DogInterceptor();
//执行代理的目标方法时,此方法自动执行
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if(method.getName().equals("info")){
di.method1();
result = method.invoke(targer, args);
di.method2();
}else {
result = method.invoke(targer, args);
}
return result;
}
//用于设置传人目标对象的方法
public void setTarger(Object o){
this.targer = o;
}
}
目标代理对象的工厂
package com.lbx.interceptor;
import java.lang.reflect.Proxy;
import com.lbx.dao.impl.DogImpl;
public class MyProxyFactory {
public static Object getProxy(Object object){
ProxyHandler handler = new ProxyHandler();
handler.setTarger(object);
return Proxy.newProxyInstance(DogImpl.class.getClassLoader(),
object.getClass().getInterfaces(), handler);
}
}
测试类
package com.lbx.test;
import com.lbx.dao.Dog;
import com.lbx.dao.impl.DogImpl;
import com.lbx.interceptor.MyProxyFactory;
public class Test {
public static void main(String[] args) {
//先要创建一个需要代理的目标对象
Dog targerObject = new DogImpl();
Dog dog = null;
//创建代理对象
Object proxy = MyProxyFactory.getProxy(targerObject);
if (proxy instanceof Dog) {
dog = (Dog)proxy;
}
dog.info();
dog.run();
}
}
分享到:
相关推荐
这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。 CGLIB 动态代理是基于类的代理, 它可以...
JDK动态代理的局限性在于,它只能为实现了至少一个接口的类创建代理,因为代理对象必须继承自这些接口。这种方式适用于那些基于接口进行编程的设计,比如Spring AOP中的Advisor和Advice。 相反,CGLIB(Code ...
JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始类相同的接口,并且在调用接口方法时,可以插入自定义的逻辑。这样,我们就可以在不...
此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行拦截和增强。 总之,JDK动态代理为我们提供了一种灵活的代码扩展机制,使得在不修改原有代码的情况...
**JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以使用JDK动态代理来创建该对象的代理。以下是JDK...
- **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...
如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。以下是一些关键概念: 1. **Proxy类**:这是...
Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...
首先,JDK动态代理基于Java的反射机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了一个方法`invoke()`,该...
在Spring AOP中,当配置了基于JDK的代理时,Spring会为每个需要拦截的方法创建一个代理对象。这个代理对象实现了目标对象的所有接口,因此可以在不修改原有代码的情况下,对方法调用进行拦截。当我们通过代理调用...
JDK动态代理只能为实现了至少一个接口的类生成代理。它的基本原理是利用反射机制生成一个实现了目标接口的子类,然后通过这个子类来调用原对象的方法。因此,如果目标类没有实现任何接口,JDK动态代理就无法工作。 ...
- **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...
- 创建一个简单的JDK动态代理,包括自定义InvocationHandler和使用Proxy生成代理对象的代码。 - 展示Spring AOP的配置,定义切面、通知以及如何在业务代码中使用。 7. **优缺点**: - JDK动态代理简单易用,但仅...
JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,我们可以创建并控制代理对象的行为。`Proxy`类提供了`...
JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...
JDK动态代理基于Java的接口实现,它要求被代理的目标对象必须实现至少一个接口。Java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口是实现JDK动态代理的关键。Proxy类提供了一个静态方法`...
基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别
动态代理在此可以用于在注入过程中添加额外的行为,例如,当注入一个EJB实例时,代理可以在注入前后执行一些操作。 2. **AOP(面向切面编程)**:动态代理常被用来实现切面,如事务管理、安全检查等。在EJB3中,...
JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。`Proxy`类用于创建动态代理实例,而`...
CGLIB(Code Generation Library)是另一个动态代理库,它基于字节码技术,可以为任何类创建代理,而不仅仅是实现了接口的类。CGLIB使用ASM库生成代理类的字节码并加载到内存中。当原始类没有接口时,CGLIB比JDK动态...