Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态代理的动态生成字节码中到底发生了什么?_Java_Jax Ws - Fatal编程技术网

Java 动态代理的动态生成字节码中到底发生了什么?

Java 动态代理的动态生成字节码中到底发生了什么?,java,jax-ws,Java,Jax Ws,使用VisualVM作为探查器,我们观察到JAX-WS运行时通过java.lang.reflect.Proxy.newProxyInstance创建的动态代理类中的高CPU利用率。此CPU使用不在执行“实际工作”的InvocationHandler中,而是在代理类(com.sun.proxy.proxy$123.myMethod())中。最终,这会导致运行代码的服务器上的CPU负载过高 我的天真理解是,动态代理只需将参数包装到对象数组中,并将其传递给使用其构造的调用处理程序,然后返回结果。由于这

使用VisualVM作为探查器,我们观察到JAX-WS运行时通过
java.lang.reflect.Proxy.newProxyInstance
创建的动态代理类中的高CPU利用率。此CPU使用不在执行“实际工作”的InvocationHandler中,而是在代理类(
com.sun.proxy.proxy$123.myMethod()
)中。最终,这会导致运行代码的服务器上的CPU负载过高


我的天真理解是,动态代理只需将参数包装到对象数组中,并将其传递给使用其构造的调用处理程序,然后返回结果。由于这几乎不会导致高CPU负载,因此我对动态代理的其他功能很感兴趣。某种可能很昂贵的安全检查?

它使用反射,这比直接方法调用的效率低几个数量级。为什么首先要使用动态代理?我们使用JAX-WS作为Soap Web服务的客户机。JAX-WS在内部使用动态代理。至于反射开销,据我所知,只有一个方法引用必须由代理创建并传递给InvocationHandler。此引用可以在构造代理时创建,这样就不需要反射代码来处理方法调用。调用该方法是反射的。抱歉,我看不出这里应该在哪里发生反射。客户端调用生成的代理的方法myMethod()。这是一个普通的方法调用。然后代理调用InvocationHandler.invoke()——另一个正常的方法调用——传递
this
、对
com.sun.Proxy.Proxy$123.myMethod
的反射方法引用以及带有参数的对象数组。我认为不涉及反射方法调用。