proxy.html
来自「j2se5-api-zh,java文档的中文版本」· HTML 代码 · 共 516 行 · 第 1/3 页
HTML
516 行
<p>当代理类的两个或多个接口包含一个具有相同名称和参数签名的方法时,代理类的接口顺序变得非常重要。在代理实例上调用<i>重复方法</i> 时,传递到调用处理程序的 <code>Method</code> 对象没有必要成为其声明类可以从接口(通过该接口调用代理方法)的引用类型指派的对象。此限制存在的原因是,生成的代理类中的相应方法实现无法确定它通过哪一个接口调用。因此,在代理实例上调用重复方法时,第一个接口中的方法的 <code>Method</code> 对象包含接口的代理类列表中的方法(直接或通过超级接口继承),该对象会传递到调用处理程序的 <code>invoke</code> 方法,无论该方法调用通过哪一种引用类型发生。<p>如果代理接口包含某一方法,它的名称和参数签名与 <code>java.lang.Object</code> 的 <code>hashCode</code>、<code>equals</code> 或 <code>toString</code> 方法相同,那么在代理实例上调用这样的方法时,传递到调用处理程序的 <code>Method</code> 对象将使 <code>java.lang.Object</code> 成为其声明类。换句话说,<code>java.lang.Object</code> 公共的非最终方法理论上在所有代理接口之前,以便确定哪一个 <code>Method</code> 对象传递到调用处理程序。<p>还要注意,当重复方法被指派到调用处理程序时,<code>invoke</code> 方法只可以抛出经过检查的异常类型,该异常类型可以使用<i>所有</i> 代理接口(可以通过它调用)中方法的 <code>throws</code> 子句指派一种异常类型。如果 <code>invoke</code> 方法抛出一个经过检查的异常,该异常没有指派给任何由一个代理接口(可以通过它调用)中的方法声明的异常类型,那么该代理实例上的调用将抛出一个未经检查的 <code>UndeclaredThrowableException</code>。此限制表示并非所有的由传递到 <code>invoke</code> 方法的 <code>Method</code> 对象上调用 <code>getExceptionTypes</code> 返回的异常类型都可以由 <code>invoke</code> 方法成功抛出。<P><P><DL><DT><B>从以下版本开始:</B></DT> <DD>1.3</DD><DT><B>另请参见:</B><DD><A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口"><CODE>InvocationHandler</CODE></A>, <A HREF="../../../serialized-form.html#java.lang.reflect.Proxy">序列化表格</A></DL><HR><P><!-- =========== FIELD SUMMARY =========== --><A NAME="field_summary"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"><B>字段摘要</B></FONT></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>protected <A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口">InvocationHandler</A></CODE></FONT></TD><TD><CODE><B><A HREF="Proxy.html#h">h</A></B></CODE><BR> 此代理实例的调用处理程序。</TD></TR></TABLE> <!-- ======== CONSTRUCTOR SUMMARY ======== --><A NAME="constructor_summary"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"><B>构造方法摘要</B></FONT></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>protected </CODE></FONT></TD><TD><CODE><B><A HREF="Proxy.html#Proxy(java.lang.reflect.InvocationHandler)">Proxy</A></B>(<A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口">InvocationHandler</A> h)</CODE><BR> 使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 <code>Proxy</code> 实例。</TD></TR></TABLE> <!-- ========== METHOD SUMMARY =========== --><A NAME="method_summary"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2"><B>方法摘要</B></FONT></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>static <A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口">InvocationHandler</A></CODE></FONT></TD><TD><CODE><B><A HREF="Proxy.html#getInvocationHandler(java.lang.Object)">getInvocationHandler</A></B>(<A HREF="../Object.html" title="java.lang 中的类">Object</A> proxy)</CODE><BR> 返回指定代理实例的调用处理程序。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>static <A HREF="../Class.html" title="java.lang 中的类">Class</A><?></CODE></FONT></TD><TD><CODE><B><A HREF="Proxy.html#getProxyClass(java.lang.ClassLoader, java.lang.Class...)">getProxyClass</A></B>(<A HREF="../ClassLoader.html" title="java.lang 中的类">ClassLoader</A> loader, <A HREF="../Class.html" title="java.lang 中的类">Class</A><?>... interfaces)</CODE><BR> 返回代理类的 <code>java.lang.Class</code> 对象,并向其提供类加载器和接口数组。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>static boolean</CODE></FONT></TD><TD><CODE><B><A HREF="Proxy.html#isProxyClass(java.lang.Class)">isProxyClass</A></B>(<A HREF="../Class.html" title="java.lang 中的类">Class</A><?> cl)</CODE><BR> 当且仅当指定的类通过 <code>getProxyClass</code> 方法或 <code>newProxyInstance</code> 方法动态生成为代理类时,返回 true。</TD></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1"><CODE>static <A HREF="../Object.html" title="java.lang 中的类">Object</A></CODE></FONT></TD><TD><CODE><B><A HREF="Proxy.html#newProxyInstance(java.lang.ClassLoader, java.lang.Class[], java.lang.reflect.InvocationHandler)">newProxyInstance</A></B>(<A HREF="../ClassLoader.html" title="java.lang 中的类">ClassLoader</A> loader, <A HREF="../Class.html" title="java.lang 中的类">Class</A><?>[] interfaces, <A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口">InvocationHandler</A> h)</CODE><BR> 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。</TD></TR></TABLE> <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor"><TH ALIGN="left"><B>从类 java.lang.<A HREF="../Object.html" title="java.lang 中的类">Object</A> 继承的方法</B></TH></TR><TR BGCOLOR="white" CLASS="TableRowColor"><TD><CODE><A HREF="../Object.html#clone()">clone</A>, <A HREF="../Object.html#equals(java.lang.Object)">equals</A>, <A HREF="../Object.html#finalize()">finalize</A>, <A HREF="../Object.html#getClass()">getClass</A>, <A HREF="../Object.html#hashCode()">hashCode</A>, <A HREF="../Object.html#notify()">notify</A>, <A HREF="../Object.html#notifyAll()">notifyAll</A>, <A HREF="../Object.html#toString()">toString</A>, <A HREF="../Object.html#wait()">wait</A>, <A HREF="../Object.html#wait(long)">wait</A>, <A HREF="../Object.html#wait(long, int)">wait</A></CODE></TD></TR></TABLE> <P><!-- ============ FIELD DETAIL =========== --><A NAME="field_detail"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"><B>字段详细信息</B></FONT></TH></TR></TABLE><A NAME="h"><!-- --></A><H3>h</H3><PRE>protected <A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口">InvocationHandler</A> <B>h</B></PRE><DL><DD>此代理实例的调用处理程序。<P><DL></DL></DL><!-- ========= CONSTRUCTOR DETAIL ======== --><A NAME="constructor_detail"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"><B>构造方法详细信息</B></FONT></TH></TR></TABLE><A NAME="Proxy(java.lang.reflect.InvocationHandler)"><!-- --></A><H3>Proxy</H3><PRE>protected <B>Proxy</B>(<A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口">InvocationHandler</A> h)</PRE><DL><DD>使用其调用处理程序的指定值从子类(通常为动态代理类)构建新的 <code>Proxy</code> 实例。<P><DL><DT><B>参数:</B><DD><CODE>h</CODE> - 此代理实例的调用处理程序</DL></DL><!-- ============ METHOD DETAIL ========== --><A NAME="method_detail"><!-- --></A><TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY=""><TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"><TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2"><B>方法详细信息</B></FONT></TH></TR></TABLE><A NAME="getProxyClass(java.lang.ClassLoader, java.lang.Class...)"><!-- --></A><H3>getProxyClass</H3><PRE>public static <A HREF="../Class.html" title="java.lang 中的类">Class</A><?> <B>getProxyClass</B>(<A HREF="../ClassLoader.html" title="java.lang 中的类">ClassLoader</A> loader, <A HREF="../Class.html" title="java.lang 中的类">Class</A><?>... interfaces) throws <A HREF="../IllegalArgumentException.html" title="java.lang 中的类">IllegalArgumentException</A></PRE><DL><DD>返回代理类的 <code>java.lang.Class</code> 对象,并向其提供类加载器和接口数组。该代理类将由指定的类加载器定义,并将实现提供的所有接口。如果类加载器已经定义了具有相同排列接口的代理类,那么现有的代理类将被返回;否则,类加载器将动态生成并定义这些接口的代理类。<p>对可以传递给 <code>Proxy.getProxyClass</code> 的参数有以下几个限制:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?