﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-JFire</title><link>http://www.blogjava.net/JFire/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 15 Apr 2026 12:10:28 GMT</lastBuildDate><pubDate>Wed, 15 Apr 2026 12:10:28 GMT</pubDate><ttl>60</ttl><item><title>java 反射机制系列（三）例子分析</title><link>http://www.blogjava.net/JFire/archive/2008/11/20/241658.html</link><dc:creator>JFire</dc:creator><author>JFire</author><pubDate>Thu, 20 Nov 2008 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/JFire/archive/2008/11/20/241658.html</guid><wfw:comment>http://www.blogjava.net/JFire/comments/241658.html</wfw:comment><comments>http://www.blogjava.net/JFire/archive/2008/11/20/241658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JFire/comments/commentRss/241658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JFire/services/trackbacks/241658.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp; 上一篇中，通过例子我们知道了如何利用反射机制创建对象，获得类变量和调用方法等。创建对象的语</span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 10pt">句是&nbsp; Class cla = Class.forName(type);&nbsp;&nbsp;&nbsp; Object obj = cla.newInstance(); 这里newInstance()实际上是使用了该类的默认无参</span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 10pt">构造方法。如果我们要调用其它的构造方法就要稍微复杂一点。比如我们要创建一个StringBuffer对象，用</span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt">new 操作符应该是StringBuffer br = new StringBuffer("example");用反射机制则要有以下步骤。<br />
首先，获得StringBuffer类的描述。<br />
Class cla = Class.forName("java.lang.StringBuffer");<br />
其次，要创建参数类型数组Class[] 。<br />
Class[] paraTypes = new Class[1];paraTypes[0]=String.class;<br />
然后，通过cla 和 paraTypes 获得Constructor 对象。<br />
Constructor constructor = cla.getConstructor(paraTypes);<br />
接着，创建传入的参数列表Object[]。<br />
Object[] paraLists = new Object[1]; paraLists[0]="color";<br />
最后，得到我们所要得对象。Object obj = constructor.newInstance(paraLists);<br />
如果我们paraTypes及paraLists设为null或长度为0，就可以用上述步骤调用StringBuffer的无参构造方法。类似地，我们可以调用对象中的有参方法。比如我们做如下操作br.insert(4, 'u');用反射机制实现如下。<br />
Class[] paratypes = new Class[]{int.class,char.class};<br />
Method method = cla.getMethod("insert", paratypes);<br />
Object[] paralists = new Object[]{4,'u'};<br />
method.invoke(obj, paralists);<br />
&nbsp;反射机制给予我们运行时才确定对象类型的便利，然而它也有显著的缺点。<br />
1，代码笨拙冗长。比如本来一句br.insert(4, 'u');可以解决的问题现在要用到四句。<br />
2，损失了编译时类型检查的好处。这使得你要对付更多的异常。<br />
3，性能损失。用反射机制运行的时间更久。<br />
&nbsp; &lt;&lt;Effective Java &gt;&gt;中给出的建议是&#8220;普通应用不应在运行时刻以映像方式访问对象，只是在很有限的情况下</span></span><span style="font-size: 12pt"><span style="font-size: 10pt">使用&#8220;。那么在什么地方会用到反射机制呢。已有的较熟悉应用是我们的IDE及一些框架。比如eclipse,编程时</span></span><span style="font-size: 12pt"><span style="font-size: 10pt">ctrl+space弹出的建议就是用到反射机制。比如Spring读取配置文件后生成对应的对象。还有RPC系统也会用</span></span><span style="font-size: 12pt"><span style="font-size: 10pt">到。对于一般的应用软件，你可以在工厂方法中用到它。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;参考文章:<br />
&lt;Effective Java&gt; 第一版 35条<br />
&lt;侯捷谈Java反射机制&gt;<br />
JAVA&nbsp;API</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.blogjava.net/JFire/aggbug/241658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JFire/" target="_blank">JFire</a> 2008-11-20 15:27 <a href="http://www.blogjava.net/JFire/archive/2008/11/20/241658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 反射机制系列（二）例子</title><link>http://www.blogjava.net/JFire/archive/2008/11/17/240958.html</link><dc:creator>JFire</dc:creator><author>JFire</author><pubDate>Mon, 17 Nov 2008 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/JFire/archive/2008/11/17/240958.html</guid><wfw:comment>http://www.blogjava.net/JFire/comments/240958.html</wfw:comment><comments>http://www.blogjava.net/JFire/archive/2008/11/17/240958.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/JFire/comments/commentRss/240958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JFire/services/trackbacks/240958.html</trackback:ping><description><![CDATA[&nbsp; 下面我以顾客买相机为例来说明Java反射机制的应用。例子中涉及的类和接口有：<br />
Camera接口：定义了takePhoto()方法。<br />
Camera01类：一种照相机的类型，实现Camera接口。<br />
Camera02类：另一种照相机的类型，实现Camera接口。<br />
Seller类：卖照相机。<br />
Customer类：买相机，有main方法。<br />
所有类都放在com包里<br />
&nbsp; 程序如下：<br />
public interface Camera {<br />
&nbsp;&nbsp;&nbsp; //声明照相机必须可以拍照<br />
&nbsp;public void takePhoto();<br />
}<br />
public class Camera01 implements Camera {<br />
&nbsp;private final int prefixs =300;//300万象素<br />
&nbsp;private final double optionZoom=3.5; //3.5倍变焦<br />
&nbsp;public void takePhoto() {<br />
&nbsp;&nbsp;System.out.println("Camera01 has taken a photo");<br />
&nbsp;}<br />
}<br />
类似的有<br />
public class Camera02 implements Camera {<br />
&nbsp;private final int prefixs =400;<br />
&nbsp;private final double optionZoom=5; <br />
&nbsp;public void takePhoto() {<br />
&nbsp;&nbsp;System.out.println("Camera02 has taken a photo");<br />
&nbsp;}<br />
}<br />
顾客出场了<br />
public class Customer {<br />
&nbsp;public static void main(String[] args){<br />
&nbsp;&nbsp;//找到一个售货员&nbsp;<br />
&nbsp;&nbsp;Seller seller = new Seller();<br />
&nbsp;&nbsp;//向售货员询问两种相机的信息<br />
&nbsp;&nbsp;seller.getDescription("com.Camera01");<br />
&nbsp;&nbsp;seller.getDescription("com.Camera02");<br />
&nbsp;&nbsp;//觉得Camera02比较好，叫售货员拿来看<br />
&nbsp;&nbsp;Camera camera =(Camera)seller.getCamera("com.Camera02");<br />
&nbsp;&nbsp;//让售货员拍张照试一下<br />
&nbsp;&nbsp;seller.testFuction(camera, "takePhoto");<br />
&nbsp;}<br />
}<br />
Seller类通过Java反射机制实现<br />
import java.lang.reflect.Field;<br />
import java.lang.reflect.Method;<br />
public class Seller {<br />
&nbsp;//向顾客描述商品信息<br />
&nbsp;public void getDescription(String type){<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Class cla = Class.forName(type);<br />
&nbsp;&nbsp;&nbsp;//生成一个实例对象，在编译时我们并不知道obj是什么类型。<br />
&nbsp;&nbsp;&nbsp;Object obj = cla.newInstance();<br />
&nbsp;&nbsp;&nbsp;//获得type类型所有已定义类变量及方法。<br />
&nbsp;&nbsp;&nbsp;Field[] fileds = cla.getDeclaredFields();<br />
&nbsp;&nbsp;&nbsp;Method[]methods = cla.getDeclaredMethods();<br />
&nbsp;&nbsp;&nbsp;System.out.println("The arguments of this Camera is:");<br />
&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;fileds.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;fileds[i].setAccessible(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//输出类变量的定义及obj实例中对应的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fileds[i]+":"+fileds[i].get(obj));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println("The function of this Camera:");<br />
&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;methods.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;//输出类中方法的定义<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(methods[i]);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;System.out.println();<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("Sorry , no such type");<br />
&nbsp;&nbsp;}<br />
&nbsp;} <br />
&nbsp;//使用商品的某个功能<br />
&nbsp;public void testFuction(Object obj,String function){<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Class cla = obj.getClass();<br />
&nbsp;&nbsp;&nbsp;//获得cla类中定义的无参方法。<br />
&nbsp;&nbsp;&nbsp;Method m = cla.getMethod(function, null);<br />
&nbsp;&nbsp;&nbsp;//调用obj中名为function的无参方法。<br />
&nbsp;&nbsp;&nbsp;m.invoke(obj, null);<br />
&nbsp;&nbsp;} catch (Exception e) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;System.out.println("Sorry , no such function");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;}&nbsp;<br />
&nbsp;}<br />
&nbsp;//拿商品给顾客<br />
&nbsp;public Object getCamera(String type){<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Class cla = Class.forName(type);<br />
&nbsp;&nbsp;&nbsp;Object obj = cla.newInstance();<br />
&nbsp;&nbsp;&nbsp;return obj;<br />
&nbsp;&nbsp;} catch (Exception e) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;System.out.println("Sorry , no such type");<br />
&nbsp;&nbsp;&nbsp;return null;<br />
&nbsp;&nbsp;}&nbsp;<br />
&nbsp;}<br />
}<br />
&nbsp; 程序到此结束，下一篇我将对程序进行分析，并补充一些内容。
  <img src ="http://www.blogjava.net/JFire/aggbug/240958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JFire/" target="_blank">JFire</a> 2008-11-17 14:30 <a href="http://www.blogjava.net/JFire/archive/2008/11/17/240958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 反射机制系列（一） 初识Java Reflection</title><link>http://www.blogjava.net/JFire/archive/2008/11/17/240945.html</link><dc:creator>JFire</dc:creator><author>JFire</author><pubDate>Mon, 17 Nov 2008 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/JFire/archive/2008/11/17/240945.html</guid><wfw:comment>http://www.blogjava.net/JFire/comments/240945.html</wfw:comment><comments>http://www.blogjava.net/JFire/archive/2008/11/17/240945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JFire/comments/commentRss/240945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JFire/services/trackbacks/240945.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java 反射机制是指Java程序可以在执行期载入，探知，使用编译期间完全未知的classes&nbsp;&nbsp;<a href='http://www.blogjava.net/JFire/archive/2008/11/17/240945.html'>阅读全文</a><img src ="http://www.blogjava.net/JFire/aggbug/240945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JFire/" target="_blank">JFire</a> 2008-11-17 13:30 <a href="http://www.blogjava.net/JFire/archive/2008/11/17/240945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Application 远程调用EJB</title><link>http://www.blogjava.net/JFire/archive/2008/11/10/239590.html</link><dc:creator>JFire</dc:creator><author>JFire</author><pubDate>Mon, 10 Nov 2008 01:07:00 GMT</pubDate><guid>http://www.blogjava.net/JFire/archive/2008/11/10/239590.html</guid><wfw:comment>http://www.blogjava.net/JFire/comments/239590.html</wfw:comment><comments>http://www.blogjava.net/JFire/archive/2008/11/10/239590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/JFire/comments/commentRss/239590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/JFire/services/trackbacks/239590.html</trackback:ping><description><![CDATA[&nbsp;<span style="font-size: 10pt">EJB中的sessionbean可以对外提供Remote接口供远程客户端调用.其客户端可以是servlet,java application,或EJB.下面我跟大家分享如何在java application中远程调用session bean.我的配置环境如下。<br />
Sessionbean:运行在websphere v6.0 中，其jndi名为"Hello"<br />
Java Application: 使用eclipse IDE 创建。<br />
&nbsp;&nbsp; 首先，要对eclipse进行配置。必须与服务器 websphere使用相同的JRE.在eclipse菜单栏中选择Window,Preferences,在弹出窗口的左边选择Java,Installed JREs.默认地，右边窗口现示安装了jre1.5.0.0_07(具体版本可能有所不同)。我们需要把它换成websphere的JRE.把jre1.5.0.0_07前面的勾去掉，点击add.在弹出窗口的第三行:JRE home directory 选择Browse....JRE的路径为C:\Program Files\IBM\Rational\SDP\6.0\runtimes\base_v6\java\jre。如果你没有安装RAD,就需要到网上下载一个JRE.一直点击OK退回eclipse主界面。<br />
&nbsp;&nbsp; 其次，要向工程添加必要的JAR。右击工程，选择Properties-Java Build Path-Add Extenal JARs。添加如下的Jar:wssec.jar,naming.jar,namingclient.jar,sas.jar,ecutils.jar,websphere.jar。这些jar都可以在C:\Program Fires\Rational\SDP\6.0\runtimes\base_v6\lib目录下找到。<br />
&nbsp;&nbsp; 接着我门要把sessionbean&#8216;Hello&#8217;的home和remote接口的.class文件拷被到eclipse的工程中，使得我们在工程中可以引用它。<br />
&nbsp;&nbsp; 具体程序如下：<br />
public class Test{<br />
&nbsp;public static void main(String[] args) throws NamingException,<br />
&nbsp;&nbsp;&nbsp;RemoteException, CreateException {<br />
&nbsp;&nbsp;Properties properties = System.getProperties();<br />
&nbsp;&nbsp;//因为客户端和sessionbean不是运行在同一服务器上，需要对properties进行配置。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果不是在同一台电脑上运行localhost需改为服务器的ip地址或主机名<br />
&nbsp;&nbsp;//900是服务器端口，默认值可能是900或2809<br />
&nbsp;&nbsp;properties.put(Context.PROVIDER_URL, "iiop://localhost:900");<br />
&nbsp;&nbsp;properties.put(Context.INITIAL_CONTEXT_FACTORY,<br />
&nbsp;&nbsp;&nbsp;&nbsp;"com.ibm.websphere.naming.WsnInitialContextFactory");<br />
&nbsp;&nbsp;Context ctx = new InitialContext(properties);<br />
&nbsp;&nbsp;Object obj = ctx.lookup("Hello");<br />
&nbsp;&nbsp;HelloHome ejbHome = (HelloHome) javax.rmi.PortableRemoteObject<br />
&nbsp;&nbsp;&nbsp;&nbsp;.narrow(obj, HelloHome.class);<br />
&nbsp;&nbsp;Hello hello= ejbHome.create();<br />
&nbsp;&nbsp;//现在我们取得了所需要的hello对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
}&nbsp;&nbsp; </span>
<img src ="http://www.blogjava.net/JFire/aggbug/239590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/JFire/" target="_blank">JFire</a> 2008-11-10 09:07 <a href="http://www.blogjava.net/JFire/archive/2008/11/10/239590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>