`
hotcharm
  • 浏览: 17113 次
  • 性别: Icon_minigender_1
  • 来自: 义乌
最近访客 更多访客>>
社区版块
存档分类
最新评论

java动态代理机制原理

 
阅读更多

Proxy的public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h),
首先通过getProxyClass 创建一个新的Class 对象,//(Class cl = getProxyClass(loader, interfaces);)
getProxyClass实现所有的包含所有的interfaces接口,并且名字为String proxyName = proxyPkg + proxyClassNamePrefix + num;
其中proxyClassNamePrefix为"$Proxy",proxyPkg 为包名,num并发控制数字
然后 Constructor cons = cl.getConstructor(constructorParams);,其中Class [] constructorParams ={ InvocationHandler.class }
return (Object) cons.newInstance(new Object[] { h });
可知:proxyName 的Class对象包含有InvocationHandler.class数组的构造器,
最后 return (Object) cons.newInstance(new Object[] { h }),即用实现InvocationHandler接口的对象作为参数实例化proxyName Class。

测试:建立一个方法打印出Class的内容:
//此类修改于http://blog.csdn.net/rokii/archive/2009/04/03/4046098.aspx,原来的方法不能正确的打印出类的内容
public static void printClassDefinition(Class clz) {

String clzModifier = Modifier.toString(clz.getModifiers())+" ";
String superClz = clz.getSuperclass().getName();
if (superClz != null && !superClz.equals("")) {
superClz = "extends " + superClz;
}
Class[] interfaces = clz.getInterfaces();
String inters = "";
for (int i = 0; i < interfaces.length; i++) {
if (i == 0) {
inters += "implements ";
}
inters += interfaces[i].getName();
}

System.out.println(clzModifier + clz.getName() + " " + superClz + " "
+ inters);
System.out.println("{");

System.out.println("//Fields:");
Field[] fields = clz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
String modifier = Modifier.toString(fields[i].getModifiers())+" ";
String fieldName = fields[i].getName();
String fieldType = fields[i].getType().getName();
System.out.println(" " + modifier + fieldType + " " + fieldName
+ ";");
}

System.out.println("//Constructs:");
Constructor[] constructs=clz.getConstructors();
for(int i=0;i<constructs.length;i++){
Constructor construct=constructs[i];
System.out.println(" "+construct.toString()+";");
}

System.out.println("//Methods:");
Method[] methods = clz.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
String modifier = Modifier.toString(method.getModifiers())+" ";
String methodName = method.getName();
Class returnClz = method.getReturnType();
String retrunType = returnClz.getName();

Class[] clzs = method.getParameterTypes();
String paraList = "(";
for (int j = 0; j < clzs.length; j++) {
paraList += clzs[j].getName();
if (j != clzs.length - 1) {
paraList += ", ";
}
}
paraList += ")";

clzs = method.getExceptionTypes();
String exceptions = "";
for (int j = 0; j < clzs.length; j++) {
if (j == 0) {
exceptions += "throws ";
}
exceptions += clzs[j].getName();
if (j != clzs.length - 1) {
exceptions += ", ";
}
}
exceptions += ";";
String methodPrototype = modifier + retrunType + " " + methodName
+ paraList + exceptions;
System.out.println(" " + methodPrototype);
}
System.out.println("}");
}

某个代理类返回对象用printClassDefinition打印如下:
public final $Proxy0 extends java.lang.reflect.Proxy implements BusinessProcessor
{
//Fields:
private static java.lang.reflect.Method m1;
private static java.lang.reflect.Method m0;
private static java.lang.reflect.Method m3;
private static java.lang.reflect.Method m4;
private static java.lang.reflect.Method m2;
//Constructs:
public $Proxy0(java.lang.reflect.InvocationHandler);
//Methods:
public final void processBusiness(int);
public final void testMethod();
public final int hashCode();
public final boolean equals(java.lang.Object);
public final java.lang.String toString();
}

可知,$Proxy0的运作原理如下:
用实现java.lang.reflect.InvocationHandler接口的对象初始化。
Fields指向的是实现java.lang.reflect.InvocationHandler接口的对象的调用方法,
Fields和Methods是一一对应的
当$Proxy0对象调用方法时,比如调用public final void processBusiness(int);
在processBusiness的内部,会把int参数传递给某个对应的Field,
然后通过Field,调用实现java.lang.reflect.InvocationHandler接口对象的方法

分享到:
评论

相关推荐

    java动态代理机制分析及拓展

    Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...

    java反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    Java动态代理机制分析

    Java 动态代理机制是Java反射机制的一部分,它允许开发者在运行时动态创建代理类和对象,以便在方法调用时插入自定义的行为。这种机制主要用于实现AOP(面向切面编程)和拦截器模式,提供了对方法调用的额外控制和...

    java动态代理 经典文章(word 2007格式的)

    在Java动态代理机制中,`InvocationHandler`接口扮演着关键角色。它定义了一个`invoke()`方法,当代理对象的方法被调用时,实际上是调用了`InvocationHandler`的`invoke()`方法。这个方法接收三个参数:代理对象、...

    Java动态代理(Spring Aop原理)

    动态代理提供了创建代理对象的机制,而Spring AOP则是基于动态代理实现的面向切面编程框架,简化了在多处插入相同逻辑的复杂度。在实际开发中,理解并熟练运用这两个技术对于提高代码质量和可维护性至关重要。

    Java代理模式Java动态代理

    通过上述介绍,我们可以看到Java代理模式及其动态代理机制为开发者提供了强大的功能扩展能力。无论是通过代理模式控制对象的访问,还是利用Java动态代理实现特定时刻的行为增强,都是在不改变现有代码结构的前提下...

    Java反射机制和动态代理

    主要讲述Java反射机制与设计模式之一:代理模式的原理与应用;同时详细讲述了Java对代理模式的支持以及Java中动态代理的原理,应用与实践。

    Java动态代理案例演示代码

    Java动态代理是Java语言提供的一种强大的机制,它允许在运行时创建具有特定接口的代理类对象,这些代理类对象能够对方法调用进行拦截和增强。动态代理在很多场景下非常有用,例如AOP(面向切面编程)、事件监听、...

    一个简单的java动态代理的实例

    Spring的代理机制可以自动创建代理对象,但原理基本相同,只是实现方式更高级,支持CGLIB等其他代理技术。 总之,Java动态代理是一个强大的工具,可以帮助我们在不修改原始代码的情况下扩展或增强对象的功能。通过...

    java动态代理实现详解

    Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...

    Java中的动态代理

    #### 二、Java动态代理机制 Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了一个静态方法`newProxyInstance()`用于创建动态代理对象,而`...

    JAVA实现动态代理的简单流程

    ### Java动态代理的实现原理 Java动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类提供了创建动态代理对象的方法,而`InvocationHandler`则定义了代理对象...

    Java 动态代理和Cglib代理(二)

    本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先,Java的动态代理基于Java的反射API实现,主要用于接口代理。当目标对象实现了至少一个接口时,我们可以使用`java.lang.reflect.Proxy`类来创建代理对象...

    java动态代理

    在Java中,动态代理是一种非常重要的机制,它允许我们在运行时动态地创建一个接口的实现类实例。这种技术广泛应用于AOP(面向切面编程)、RPC(远程过程调用)等领域。通过动态代理,我们可以在不修改原有代码的情况...

    Java动态代理实现数据源连接池

    Java动态代理是Java语言提供的一种机制,它允许在运行时创建一个对象的代理,这个代理对象可以在调用实际方法之前和之后添加额外的功能。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang....

    java反射机制原理

    - **动态代理**:Java的`java.lang.reflect.Proxy`类可以创建动态代理对象,实现接口的动态方法调用。 然而,反射也存在一些潜在的问题,如性能损耗、安全性风险(可访问私有成员)以及易用性降低(编译器无法提供...

Global site tag (gtag.js) - Google Analytics