第一种使用jdk实现
第二种使用cglib实现
代码写的比较飘逸,娱乐与教学并存。
jdk实现动态代理(接口)
public interface 打架接口 {
public void 开打();
}
public class 打架 implements 打架接口 {
@Override
public void 开打() {
System.out.println("威哥 打出绝技 降龙十八掌。。。");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class 打架小帮手 implements InvocationHandler{
private Object delegate;
public Object binder(Object delegate) {
this.delegate = delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("小弟们 冲啊。。。");
Object invoke = method.invoke(delegate, args);
System.out.println("哥在江湖又留下了一段传说。。。");
return invoke;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class 威哥 {
public static void main(String[] args) {
打架接口 打架接口 = (打架接口) new 打架小帮手().binder(new 打架());
打架接口.开打();
}
// 我要去打架
// 1 叫上小弟
// 2 打架
// 3 哥又留下一段传说
}
cglib实现动态代理
public class 打架 {
public void 开打() {
System.out.println("威哥 打出绝技 降龙十八掌。。。");
}
}
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class 打架小帮手 implements MethodInterceptor {
@Override
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("小弟们 冲啊。。。");
Object result = methodProxy.invokeSuper(object,args);
System.out.println("哥在江湖又留下了一段传说。。。");
return result;
}
public Object createProxy(Class targetClass){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
enhancer.setCallback(new 打架小帮手());
return enhancer.create();
}
}
public class 威哥 {
public static void main(String rags[]){
打架 打架 = new 打架();
打架小帮手 帮手 = new 打架小帮手();
打架 打架代理 = (打架) 帮手.createProxy(打架.getClass());
打架代理.开打();
}
}
分享到:
相关推荐
Java提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...
Java中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理是基于接口的,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...
动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...
在Java中,动态代理主要分为两种实现方式:JDK动态代理和CGLIB动态代理。这两种实现方式各有特点,适用于不同的场景。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,它要求被代理的目标类必须实现一个或多...
代理模式分为静态代理和动态代理两种主要形式。 **静态代理**是程序员手动创建代理类,这个代理类与真实被代理的对象(目标对象)实现相同的接口。代理类在调用目标对象方法时,可以加入额外的操作,如日志记录、...
动态代理主要分为JDK动态代理和CGLIB动态代理两种方式: 1. **JDK动态代理**: JDK动态代理基于接口实现,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来创建代理对象。首先,...
在IOC框架中,动态代理的实现方式主要有两种:JDK动态代理和CGLIB动态代理。 1. JDK动态代理:JDK内置的java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口提供了实现动态代理的能力。当被代理的...
JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
Spring框架中的动态代理有两种主要实现:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,而CGLIB则适用于没有接口或不希望为类创建接口的情况。 在Spring MVC中,我们可以使用Spring的AOP支持来创建拦截器...
在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...
Spring AOP提供了两种动态代理方式:JDK代理和CGLIB代理。选择哪种代理方式取决于目标对象是否实现了接口。 1. JDK代理:如果目标对象实现了至少一个接口,Spring AOP会使用JDK的动态代理机制。在这种情况下,...
Spring框架提供了两种动态代理机制:JDK动态代理和CGLIB代理,它们分别基于这两种技术。 1. JDK动态代理: - 当被代理的目标对象实现了至少一个接口时,Spring会选择使用JDK动态代理。它通过反射机制生成一个实现...
在Java中,有两种实现动态代理的方式: 1. Java.lang.reflect.Proxy:使用Proxy类和InvocationHandler接口,可以为任何实现了相同接口的对象创建代理。 2. CGLIB库:当目标类没有实现接口时,CGLIB库可以通过字节码...
Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...
在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...
静态代理的实现有两种方式:聚合和继承。 1. **聚合式静态代理**: 在这种方式中,代理类聚合(拥有)真实对象,它们都实现同一接口。当调用代理类的方法时,代理类会在调用真实对象方法前后添加自己的逻辑。例如...
代理模式分为两种主要类型:虚拟代理和动态代理。这两种代理方式在实际开发中都有广泛的应用。 虚拟代理通常用于延迟加载或者缓存。例如,当需要加载一个大图片时,我们可以先用一个小的占位符(如loading图)作为...
在实际应用中,选择哪种动态代理方式主要取决于目标对象是否实现了接口以及对性能和灵活性的需求。如果目标对象实现了接口,优先考虑JDK动态代理;如果没有实现接口或者需要更高级的功能,如类级别的扩展,那么CGLIB...