proxy.html
来自「j2se5-api-zh,java文档的中文版本」· HTML 代码 · 共 516 行 · 第 1/3 页
HTML
516 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><!--NewPage--><HTML><HEAD><!-- Generated by javadoc (build 1.5.0_03) on Wed Nov 02 09:50:24 CST 2005 --><META http-equiv="Content-Type" content="text/html; charset=gb2312"><TITLE>Proxy (Java 2 Platform SE 5.0)</TITLE><META NAME="keywords" CONTENT="java.lang.reflect.Proxy class"><LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style"><SCRIPT type="text/javascript">function windowTitle(){ parent.document.title="Proxy (Java 2 Platform SE 5.0)";}</SCRIPT><NOSCRIPT></NOSCRIPT></HEAD><BODY BGCOLOR="white" onload="windowTitle();"><!-- ========= START OF TOP NAVBAR ======= --><A NAME="navbar_top"><!-- --></A><A HREF="#skip-navbar_top" title="跳过导航链接"></A><TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""><TR><TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"><A NAME="navbar_top_firstrow"><!-- --></A><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <TR ALIGN="center" VALIGN="top"> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>概述</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>软件包</B></FONT></A> </TD> <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>类</B></FONT> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="class-use/Proxy.html"><FONT CLASS="NavBarFont1"><B>使用</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>树</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>已过时</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-files/index-1.html"><FONT CLASS="NavBarFont1"><B>索引</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>帮助</B></FONT></A> </TD> </TR></TABLE></TD><TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Java<sup><font size=-2>TM</font></sup> 2 Platform<br>Standard Ed. 5.0</b></EM></TD></TR><TR><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <A HREF="ParameterizedType.html" title="java.lang.reflect 中的接口"><B>上一个类</B></A> <A HREF="ReflectPermission.html" title="java.lang.reflect 中的类"><B>下一个类</B></A></FONT></TD><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <A HREF="../../../index.html@java_2Flang_2Freflect_2FProxy.html" target="_top"><B>框架</B></A> <A HREF="Proxy.html" target="_top"><B>无框架</B></A> <SCRIPT type="text/javascript"> <!-- if(window==top) { document.writeln('<A HREF="../../../allclasses-noframe.html"><B>所有类</B></A>'); } //--></SCRIPT><NOSCRIPT> <A HREF="../../../allclasses-noframe.html"><B>所有类</B></A></NOSCRIPT></FONT></TD></TR><TR><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> 摘要: 嵌套 | <A HREF="#field_summary">字段</A> | <A HREF="#constructor_summary">构造方法</A> | <A HREF="#method_summary">方法</A></FONT></TD><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">详细信息: <A HREF="#field_detail">字段</A> | <A HREF="#constructor_detail">构造方法</A> | <A HREF="#method_detail">方法</A></FONT></TD></TR></TABLE><A NAME="skip-navbar_top"></A><!-- ========= END OF TOP NAVBAR ========= --><HR><!-- ======== START OF CLASS DATA ======== --><H2><FONT SIZE="-1">java.lang.reflect</FONT><BR>类 Proxy</H2><PRE><A HREF="../Object.html" title="java.lang 中的类">java.lang.Object</A> <IMG SRC="../../../resources/inherit.gif" ALT="继承者 "><B>java.lang.reflect.Proxy</B></PRE><DL><DT><B>所有已实现的接口:</B> <DD>java.io.Serializable</DD></DL><HR><DL><DT><PRE>public class <B>Proxy</B><DT>extends <A HREF="../Object.html" title="java.lang 中的类">Object</A><DT>implements java.io.Serializable</DL></PRE><P><code>Proxy</code> 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。<p>创建某一接口 <code>Foo</code> 的代理: <pre> InvocationHandler handler = new MyInvocationHandler(...); Class proxyClass = Proxy.getProxyClass( Foo.class.getClassLoader(), new Class[] { Foo.class }); Foo f = (Foo) proxyClass. getConstructor(new Class[] { InvocationHandler.class }). newInstance(new Object[] { handler }); </pre>或使用以下更简单的方法: <pre> Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { Foo.class }, handler); </pre><p><i>动态代理类</i>(以下简称为<i>代理类</i>)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。<i>代理接口</i> 是代理类实现的一个接口。<i>代理实例</i> 是代理类的一个实例。每个代理实例都有一个关联的<i>调用处理程序</i> 对象,它可以实现接口 <A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口"><CODE>InvocationHandler</CODE></A>。通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 <A HREF="InvocationHandler.html#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])"><CODE>Invoke</CODE></A> 方法,并传递代理实例、识别调用方法的 <code>java.lang.reflect.Method</code> 对象以及包含参数的 <code>Object</code> 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。<p>代理类具用以下属性:<ul><li>代理类是公共的、最终的,而不是抽象的。<li>未指定代理类的非限定名称。但是,以字符串 <code>"$Proxy"</code> 开头的类名空间应该为代理类保留。<li>代理类扩展 <code>java.lang.reflect.Proxy</code>。<li>代理类会按同一顺序准确地实现其创建时指定的接口。<li>如果代理类实现了非公共接口,那么它将在与该接口相同的包中定义。否则,代理类的包也是未指定的。注意,包密封将不阻止代理类在运行时在特定包中的成功定义,也不会阻止相同类加载器和带有特定签名的包所定义的类。<li>由于代理类将实现所有在其创建时指定的接口,所以对其 <code>Class</code> 对象调用 <code>getInterfaces</code> 将返回一个包含相同接口列表的数组(按其创建时指定的顺序),对其 <code>Class</code> 对象调用 <code>getMethods</code> 将返回一个包括这些接口中所有方法的 <code>Method</code> 对象的数组,并且调用 <code>getMethod</code> 将会在代理接口中找到期望的一些方法。<li>如果 <A HREF="Proxy.html#isProxyClass(java.lang.Class)"><CODE>Proxy.isProxyClass</CODE></A> 方法传递代理类(由 <code>Proxy.getProxyClass</code> 返回的类,或由 <code>Proxy.newProxyInstance</code> 返回的对象的类),则该方法返回 true,否则返回 false。<li>代理类的 <code>java.security.ProtectionDomain</code> 与由引导类加载器(如 <code>java.lang.Object</code>)加载的系统类相同,原因是代理类的代码由受信任的系统代码生成。此保护域通常被授予 <code>java.security.AllPermission</code>。<li>每个代理类都有一个可以带一个参数(接口 <A HREF="InvocationHandler.html" title="java.lang.reflect 中的接口"><CODE>InvocationHandler</CODE></A> 的实现)的公共构造方法,用于设置代理实例的调用处理程序。并非必须使用反射 API 才能访问公共构造方法,通过调用 <A HREF="Proxy.html#newProxyInstance(java.lang.ClassLoader, java.lang.Class[], java.lang.reflect.InvocationHandler)"><CODE>Proxy.newInstance</CODE></A> 方法(将调用 <A HREF="Proxy.html#getProxyClass(java.lang.ClassLoader, java.lang.Class...)"><CODE>Proxy.getProxyClass</CODE></A> 的操作和调用带有调用处理程序的构造方法结合在一起)也可以创建代理实例。 </ul><p>代理实例具有以下属性: <ul><li>提供代理实例 <code>proxy</code> 和一个由其代理类 <code>Foo</code> 实现的接口,以下表达式将返回 true: <pre> <code>proxy instanceof Foo</code> </pre>并且以下的强制转换操作将会成功(而不抛出 <code>ClassCastException</code>): <pre> <code>(Foo) proxy</code> </pre><li>每个代理实例都有一个关联的调用处理程序,它会被传递到其构造方法中。静态 <A HREF="Proxy.html#getInvocationHandler(java.lang.Object)"><CODE>Proxy.getInvocationHandler</CODE></A> 方法将返回与作为其参数传递的代理实例相关的调用处理程序。<li>代理实例上的接口方法调用将按照该方法的文档描述进行编码,并被指派到调用处理程序的 <A HREF="InvocationHandler.html#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])"><CODE>Invoke</CODE></A> 方法。<li>在代理实例上的 <code>java.lang.Object</code> 中声明的 <code>hashCode</code>、<code>equals</code> 或 <code>toString</code> 方法的调用将按照与编码和指派接口方法调用相同的方式进行编码,并被指派到调用处理程序的 <code>invoke</code> 方法,如上所述。传递到 <code>invoke</code> 的 <code>Method</code> 对象的声明类是 <code>java.lang.Object</code>。代理类不重写从 <code>java.lang.Object</code> 继承的代理实例的其他公共方法,所以这些方法的调用行为与其对 <code>java.lang.Object</code> 实例的操作一样。 </ul><h3>在多代理接口中重复的方法</h3>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?