import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; public class BusinessProxyGenerateByJdk extends Proxy implements Business { private static final long serialVersionUID = 1L; private static Method m1; private static Method m0; private static Method m3; private static Method m2; private static Method m4; static { try { m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") }); m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]); m3 = Class.forName("com.jaeson.javastudy.Business").getMethod("service", new Class[0]); m4 = Class.forName("com.jaeson.javastudy.Business").getMethod("execute", new Class[0]); m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]); } catch (NoSuchMethodException nosuchmethodexception) { throw new NoSuchMethodError(nosuchmethodexception.getMessage()); } catch (ClassNotFoundException classnotfoundexception) { throw new NoClassDefFoundError(classnotfoundexception.getMessage()); } } public BusinessProxyGenerateByJdk(InvocationHandler invocationhandler) { super(invocationhandler); } @Override public final boolean equals(Object obj) { try { return ((Boolean) super.h.invoke(this, m1, new Object[] { obj })) .booleanValue(); } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } @Override public final int hashCode() { try { return ((Integer) super.h.invoke(this, m0, null)).intValue(); } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } @Override public final void service() { try { super.h.invoke(this, m3, null); return; } catch (Error e) { } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } @Override public final void execute() { try { super.h.invoke(this, m4, null); return; } catch (Error e) { } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } @Override public final String toString() { try { return (String) super.h.invoke(this, m2, null); } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } } public static void main(String[] args) { BusinessHandler handler = new BusinessHandler(new BusinessImpl()); new BusinessProxyGenerateByJdk(handler).service(); new BusinessProxyGenerateByJdk(handler).execute(); } }
相关推荐
4. **模拟内部实现**: 要模拟JDK动态代理的内部实现,我们可以自己创建一个类来代替`Proxy`,并一个接口来代替`InvocationHandler`。这样,我们就能自由控制代理的创建过程和方法调用的行为,从而更好地理解动态代理...
**动态代理**则是在运行时动态生成代理类,无需预先编写代理类的源代码。在Java中,JDK提供了动态代理的实现,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理的优点在于更加...
首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况;而CGLIB则是通过字节码技术,可以在无接口的情况下生成目标类的子类,实现对...
**Proxy类**是动态代理的核心,它提供了生成代理对象的方法。代理对象是实现了特定接口的实例,这些接口由原始目标对象实现。使用`Proxy.newProxyInstance()`方法,我们可以创建一个代理对象,该方法接受三个参数: ...
当使用CGLIB时,Spring实际上就是在底层利用ASM来生成代理类的字节码。 在ASM中,我们首先需要了解几个核心概念: 1. **ClassWriter**: 这个类负责生成字节码,它是ASM的核心组件之一。通过向ClassWriter发送指令...
// 设置被代理类 enhancer.setSuperclass(MyClass.class); // 设置回调函数 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, ...
接下来,JDK代理是Java提供的一种动态代理机制,它允许我们在运行时创建一个代理类,该类可以对目标对象的方法调用进行拦截和增强。在MyBatis中,SqlSession的每个方法调用都会被代理,使得我们可以插入SQL执行前后...
JDK提供了一种基于接口的动态代理机制,但当被代理类没有实现接口时,CGLib则提供了一种基于类的解决方案。 2. **CGLib库**:CGLib全称Code Generation Library,是一个强大的高性能的代码生成库,主要用于在运行期...
这些库允许我们直接操作字节码,生成更灵活的代理类。 - `javassist`是一个流行的开源库,可以方便地创建、修改和分析Java类。它可以用来动态生成实现特定接口的类,并在方法调用中插入额外的代码。 - `ASM`是另一...
- **动态代理**:通过运行时生成代理对象,可以为任意实现了特定接口的类提供代理服务,无需手动编写代理类,更加灵活。 综上所述,Java动态代理提供了一种强大的工具来增强现有类的功能,尤其是在需要横切关注点...
因为在运行时生成代理对象和处理方法调用会带来一定的开销。因此,在性能敏感的场景下,需要权衡是否使用动态代理。 7. **扩展应用** - 动态代理还可用于模拟远程调用,比如RMI(远程方法调用)中的代理对象,以及...
我们可以通过`Enhancer`创建一个增强器实例,然后设置回调函数(Callback),最后通过`enhancer.create()`方法生成代理对象。回调函数通常是`MethodInterceptor`,它包含了一个`intercept`方法,这个方法会在目标...
要进行模拟,首先需要了解CGLIB代理的核心实现原理,包括代理类的生成、方法拦截和回调机制等。 1. 代理类的生成 CGLIB使用Enhancer类来生成代理对象。Enhancer的工作原理是对指定的目标类进行字节码增强,并创建该...
- CGlib生成的代理类会继承目标类,所以如果目标类声明为final,CGlib将无法创建代理。 - 对于包含final方法的目标类,CGlib也无法在这些方法上添加拦截器。 - 如果目标类中包含静态方法,CGlib代理不会影响静态方法...
JDK动态代理只支持接口代理,如果需要代理的类没有实现任何接口,就需要借助第三方库如CGLIB来生成字节码实现类的代理。CGLIB基于ASM库,可以在运行时动态生成子类并实现方法拦截。 5. **源码解析**: JDK动态...
CGLIB的动态代理机制比Java自带的JDK动态代理更为灵活,因为JDK动态代理只能代理实现了接口的类,而CGLIB则可以代理任何类,只要该类不是final的。 在CGLIB中,核心类包括Enhancer、MethodInterceptor和Callback。...
CGlib通过生成字节码动态创建子类实现,适用于不满足JDK代理的情况。 总结,Java动态代理是Java设计模式中的一种重要工具,它为开发者提供了在运行时扩展或增强已有对象功能的能力,是实现AOP和提高代码灵活性的...
- 类加载器:用于加载代理类的类加载器。 - 接口列表:代理对象需要实现的接口列表,这决定了代理对象可以被调用的方法集合。 - InvocationHandler:代理对象在接收到方法调用时,将调用这个接口的`invoke()`方法...
`Proxy`类通过JVM的字节码技术生成代理类的字节码,然后使用类加载器加载这个字节码,从而创建出代理对象。`InvocationHandler.invoke()`方法的实现决定了代理对象的行为。 5. **工具应用**:在实际开发中,Java...
动态代理在运行时根据接口或类动态生成代理对象,这使得代理对象的创建更加灵活,无需预先定义代理类。 在压缩包文件"spring_daili"中,可能包含了实现上述步骤的源代码示例,包括接口定义、目标类、静态代理类以及...