`
jaesonchen
  • 浏览: 311652 次
  • 来自: ...
社区版块
存档分类
最新评论

jdk动态代理生成的代理类模拟

 
阅读更多
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();
	}
}  

 

 

分享到:
评论

相关推荐

    模拟JDK动态代理内部实现

    4. **模拟内部实现**: 要模拟JDK动态代理的内部实现,我们可以自己创建一个类来代替`Proxy`,并一个接口来代替`InvocationHandler`。这样,我们就能自由控制代理的创建过程和方法调用的行为,从而更好地理解动态代理...

    静态代理动态代理测试,模拟jdk实现动态代理

    **动态代理**则是在运行时动态生成代理类,无需预先编写代理类的源代码。在Java中,JDK提供了动态代理的实现,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理的优点在于更加...

    个人用java动态代理模拟实现spring aop

    首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况;而CGLIB则是通过字节码技术,可以在无接口的情况下生成目标类的子类,实现对...

    JDK动态代理

    **Proxy类**是动态代理的核心,它提供了生成代理对象的方法。代理对象是实现了特定接口的实例,这些接口由原始目标对象实现。使用`Proxy.newProxyInstance()`方法,我们可以创建一个代理对象,该方法接受三个参数: ...

    ASM操作字节码,动态生成Java类class文件

    当使用CGLIB时,Spring实际上就是在底层利用ASM来生成代理类的字节码。 在ASM中,我们首先需要了解几个核心概念: 1. **ClassWriter**: 这个类负责生成字节码,它是ASM的核心组件之一。通过向ClassWriter发送指令...

    cglib动态生成java类

    // 设置被代理类 enhancer.setSuperclass(MyClass.class); // 设置回调函数 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, ...

    使用ImportBeanDefinitionRegistrar、JDK代理、FactoryBean模拟mybatis原理.zip

    接下来,JDK代理是Java提供的一种动态代理机制,它允许我们在运行时创建一个代理类,该类可以对目标对象的方法调用进行拦截和增强。在MyBatis中,SqlSession的每个方法调用都会被代理,使得我们可以插入SQL执行前后...

    cglib动态代理

    JDK提供了一种基于接口的动态代理机制,但当被代理类没有实现接口时,CGLib则提供了一种基于类的解决方案。 2. **CGLib库**:CGLib全称Code Generation Library,是一个强大的高性能的代码生成库,主要用于在运行期...

    动态代理

    这些库允许我们直接操作字节码,生成更灵活的代理类。 - `javassist`是一个流行的开源库,可以方便地创建、修改和分析Java类。它可以用来动态生成实现特定接口的类,并在方法调用中插入额外的代码。 - `ASM`是另一...

    java的动态代理

    - **动态代理**:通过运行时生成代理对象,可以为任意实现了特定接口的类提供代理服务,无需手动编写代理类,更加灵活。 综上所述,Java动态代理提供了一种强大的工具来增强现有类的功能,尤其是在需要横切关注点...

    动态代理原理实例Demo

    因为在运行时生成代理对象和处理方法调用会带来一定的开销。因此,在性能敏感的场景下,需要权衡是否使用动态代理。 7. **扩展应用** - 动态代理还可用于模拟远程调用,比如RMI(远程方法调用)中的代理对象,以及...

    cglib动态代理介绍

    我们可以通过`Enhancer`创建一个增强器实例,然后设置回调函数(Callback),最后通过`enhancer.create()`方法生成代理对象。回调函数通常是`MethodInterceptor`,它包含了一个`intercept`方法,这个方法会在目标...

    简单模拟spring cglib代理

    要进行模拟,首先需要了解CGLIB代理的核心实现原理,包括代理类的生成、方法拦截和回调机制等。 1. 代理类的生成 CGLIB使用Enhancer类来生成代理对象。Enhancer的工作原理是对指定的目标类进行字节码增强,并创建该...

    转载:cglib动态代理介绍(一)

    - CGlib生成的代理类会继承目标类,所以如果目标类声明为final,CGlib将无法创建代理。 - 对于包含final方法的目标类,CGlib也无法在这些方法上添加拦截器。 - 如果目标类中包含静态方法,CGlib代理不会影响静态方法...

    动态代理底层源码核心思想版

    JDK动态代理只支持接口代理,如果需要代理的类没有实现任何接口,就需要借助第三方库如CGLIB来生成字节码实现类的代理。CGLIB基于ASM库,可以在运行时动态生成子类并实现方法拦截。 5. **源码解析**: JDK动态...

    cglib(动态代理)

    CGLIB的动态代理机制比Java自带的JDK动态代理更为灵活,因为JDK动态代理只能代理实现了接口的类,而CGLIB则可以代理任何类,只要该类不是final的。 在CGLIB中,核心类包括Enhancer、MethodInterceptor和Callback。...

    java dtdl 动态代理

    CGlib通过生成字节码动态创建子类实现,适用于不满足JDK代理的情况。 总结,Java动态代理是Java设计模式中的一种重要工具,它为开发者提供了在运行时扩展或增强已有对象功能的能力,是实现AOP和提高代码灵活性的...

    java中动态代理,springAop.pdf

    - 类加载器:用于加载代理类的类加载器。 - 接口列表:代理对象需要实现的接口列表,这决定了代理对象可以被调用的方法集合。 - InvocationHandler:代理对象在接收到方法调用时,将调用这个接口的`invoke()`方法...

    java动态代理总结(狗星例子)

    `Proxy`类通过JVM的字节码技术生成代理类的字节码,然后使用类加载器加载这个字节码,从而创建出代理对象。`InvocationHandler.invoke()`方法的实现决定了代理对象的行为。 5. **工具应用**:在实际开发中,Java...

    Spring模拟aop静态代理案例

    动态代理在运行时根据接口或类动态生成代理对象,这使得代理对象的创建更加灵活,无需预先定义代理类。 在压缩包文件"spring_daili"中,可能包含了实现上述步骤的源代码示例,包括接口定义、目标类、静态代理类以及...

Global site tag (gtag.js) - Google Analytics