﻿<?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-『JAVA吧』</title><link>http://www.blogjava.net/youyu/</link><description>JAVA</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:10:51 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:10:51 GMT</pubDate><ttl>60</ttl><item><title>会议室预定系统(java简易控制台版--access数据库)</title><link>http://www.blogjava.net/youyu/archive/2007/06/11/123458.html</link><dc:creator>鱿鱼</dc:creator><author>鱿鱼</author><pubDate>Mon, 11 Jun 2007 12:41:00 GMT</pubDate><guid>http://www.blogjava.net/youyu/archive/2007/06/11/123458.html</guid><wfw:comment>http://www.blogjava.net/youyu/comments/123458.html</wfw:comment><comments>http://www.blogjava.net/youyu/archive/2007/06/11/123458.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/youyu/comments/commentRss/123458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youyu/services/trackbacks/123458.html</trackback:ping><description><![CDATA[java课程的最后一次大作业<br>当作考试的<br>时间紧<br>粗糙的做了一下<br><br><a style="COLOR: #ff0000" href="http://www.blogjava.net/Files/youyu/JavaHW(会议室预定系统--数据库版).rar">http://www.blogjava.net/Files/youyu/JavaHW(会议室预定系统--数据库版).rar</a>
<img src ="http://www.blogjava.net/youyu/aggbug/123458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youyu/" target="_blank">鱿鱼</a> 2007-06-11 20:41 <a href="http://www.blogjava.net/youyu/archive/2007/06/11/123458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Reflection-Java中的反射机制(转)</title><link>http://www.blogjava.net/youyu/archive/2007/05/16/117917.html</link><dc:creator>鱿鱼</dc:creator><author>鱿鱼</author><pubDate>Wed, 16 May 2007 11:20:00 GMT</pubDate><guid>http://www.blogjava.net/youyu/archive/2007/05/16/117917.html</guid><wfw:comment>http://www.blogjava.net/youyu/comments/117917.html</wfw:comment><comments>http://www.blogjava.net/youyu/archive/2007/05/16/117917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youyu/comments/commentRss/117917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youyu/services/trackbacks/117917.html</trackback:ping><description><![CDATA[<h2>Java looking at Java</h2>
&nbsp;&nbsp; Java的一个很不寻常的能力，它允许一个程序检查自己<br>&nbsp;&nbsp; 你可以确定一个对象所属的类型<br>&nbsp;&nbsp; 你可以查看一个类的全部内容,它们的访问修饰符、父类、字段、构造函数、方法<br>&nbsp;&nbsp; 你可以查看一个接口的内容<br>&nbsp;&nbsp; 即使在编写代码的时候你不知道事物的名字你也可以做到：<br>&nbsp;&nbsp; 创建一个类的实例<br>&nbsp;&nbsp; 取得和设置一个实例的变量<br>&nbsp;&nbsp; 调用一个对象的一个方法<br>&nbsp;&nbsp; 创建和操作数组<br><br>&nbsp;&nbsp; 我猜它之所以被称为&#8220;反射&#8221;是因为它允许一个Java应用程序像&#8220;在镜子里&#8221;看到自己一样。<br>
<h2>What is reflection for?</h2>
&nbsp;&nbsp; 在&#8220;平常&#8221;的程序中你可能用不到反射<br>&nbsp;&nbsp; 如果你是在使用应用程序来操作应用程序，那你就需要使用反射了。<br>&nbsp;&nbsp; 典型的应用：<br>&nbsp;&nbsp; 一个类型查看器<br>&nbsp;&nbsp; 一个调试程序<br>&nbsp;&nbsp; 一个GUI创建器<br>&nbsp;&nbsp; 一个IDE，比喻说BlueJ或Eclipse<br>
<h2>IDE</h2>
&nbsp;&nbsp; 有需要的IDE本身就是用Java编写的—它们可以做什么?<br>&nbsp;&nbsp; 编译一个程序(简单—只是一个系统调用)<br>&nbsp;&nbsp; 编译后加载进你的系统<br>&nbsp;&nbsp; 弄清楚你都有些什么类，它们的构造函数和方法<br>&nbsp;&nbsp; 执行你的main方法<br>&nbsp;&nbsp; 替你创建对象，即使现在没有运行main方法<br>&nbsp;&nbsp; 为对象传递信息，并显示结果<br>&nbsp;&nbsp; 这些所有的功能，除了编译都是使用反射做到的<br>
<h2>Class 类</h2>
&nbsp;&nbsp; 要发现一个具体的类的信息,首先要取得它的Class 对象<br>&nbsp;&nbsp; 如果你有一个 obj 对象,你可以通过下面的方式来取得它的class对象<br>Class c = obj.getClass();<br>&nbsp;&nbsp; 你可以通过一个class的实例c 取得它的父类<br>Class sup = c.getSuperclass();<br>&nbsp;&nbsp; 如果你已经知道一个类在编译时候的名字 (比喻说, Button) ,你可以通过下面这样的简单方法取得class对象<br>Class c = Button.class;<br>&nbsp;&nbsp; 如果你知道一个类在运行期的名字(比喻说，一个String类型变量str),你可以通过下面的方法取得类对象<br>Class c = Class.forName(str);<br>
<h2>取得类的名字</h2>
&nbsp;&nbsp; 如果你已经有了一个class对象c，你可以通过下面的方法取得类的名字 c.getName()<br>&nbsp;&nbsp; getName 取得类的全路径名字; 比喻说,<br>&nbsp;&nbsp;&nbsp; Class c = Button.class;<br>&nbsp;&nbsp;&nbsp; String s = c.getName();<br>&nbsp;&nbsp;&nbsp; System.out.println(s);<br>会输出<br>&nbsp;&nbsp;&nbsp; java.awt.Button<br>&nbsp;&nbsp; 类 Class 和它的方法都是在 java.lang中,所以不需要使用import使其可用。<br>
<h2>取得所有的父类</h2>
&nbsp;&nbsp; getSuperclass() 返回一个 Class 对象 (或者 null 如果你在 Object上使用的话,它是没有父类的 )<br><br>&nbsp;&nbsp; 下面的代码来自Sun的入门指南:<br><br>&nbsp;&nbsp;&nbsp;&nbsp; static void printSuperclasses(Object o) {<br>&nbsp;&nbsp;&nbsp;&nbsp; Class subclass = o.getClass();<br>&nbsp;&nbsp;&nbsp;&nbsp; Class superclass = subclass.getSuperclass();<br>&nbsp;&nbsp;&nbsp;&nbsp; while (superclass != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp; String className = superclass.getName();<br>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(className);<br>&nbsp;&nbsp;&nbsp;&nbsp; subclass = superclass;<br>&nbsp;&nbsp;&nbsp;&nbsp; superclass = subclass.getSuperclass();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>
<h2>取得类的修饰符I</h2>
&nbsp;&nbsp; Class对象有一个实例方法 getModifiers() ，它返回一个int型的值<br><br>&nbsp;&nbsp; 为了&#8220;解释&#8221; int 型的结果，我们要用到Modifier类的一些方法，它们位于 java.lang.reflect, 所以:<br><br>&nbsp;&nbsp;&nbsp; import java.lang.reflect.*;<br><br>&nbsp;&nbsp; 现在我们就可以做下面的事情了:<br><br>if (Modifier.isPublic(m)) {<br>&nbsp;&nbsp;&nbsp; System.out.println("public");<br>}<br>
<h2>取得类的修饰符II</h2>
&nbsp;&nbsp; Modifier 包含下面的一些方法 (只列出部分):<br>&nbsp;&nbsp; public static boolean isAbstract(int)<br>&nbsp;&nbsp; public static boolean isFinal(int)<br>&nbsp;&nbsp; public static boolean isInterface(int)<br>&nbsp;&nbsp; public static boolean isPrivate(int)<br>&nbsp;&nbsp; public static boolean isProtected(int)<br>&nbsp;&nbsp; public static boolean isPublic(int)<br>&nbsp;&nbsp; public static String toString(int)<br>&nbsp;&nbsp; 这会返回一个如下所示的字符串<br>"public final synchronized strictfp"<br>
<h2>取得接口</h2>
&nbsp;&nbsp; 一个类可以实现０个或多个接口<br>&nbsp;&nbsp; getInterfaces() 返回一个 Class 对象的数组<br>&nbsp;&nbsp; 这些是类实现的一些接口<br>&nbsp;&nbsp; 下面的代码来自Sun的入门指南:<br>&nbsp;&nbsp; static void printInterfaceNames(Object o) {<br>&nbsp;&nbsp;&nbsp; Class c = o.getClass();<br>&nbsp;&nbsp;&nbsp; Class[ ] theInterfaces = c.getInterfaces();<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; theInterfaces.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String interfaceName = theInterfaces[i].getName();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(interfaceName);<br>&nbsp;&nbsp;&nbsp; }<br>}<br>&nbsp;&nbsp; 注意：零长度数组在Java中是合法的<br>
<h2>判断类和接口</h2>
&nbsp;&nbsp; Class 类既能代表类也能代表接口<br>&nbsp;&nbsp; 要确定一个给定的 Class 对象 c 是否是一个是接口，可以使用 c.isInterface()<br>&nbsp;&nbsp; 要研究class对象的更多内容的话，你可以使用下面这些方法:<br>&nbsp;&nbsp; getModifiers()<br>&nbsp;&nbsp; getFields()&nbsp;&nbsp;&nbsp; // "fields" == "instance variables"<br>&nbsp;&nbsp; getConstructors()<br>&nbsp;&nbsp; getMethods()<br>&nbsp;&nbsp; isArray()<br>
<h2>取得字段</h2>
&nbsp;&nbsp; public Field[] getFields() throws SecurityException<br>&nbsp;&nbsp; 返回一个public的字段数组 (变量)<br>&nbsp;&nbsp; 数组的长度允许是０<br>&nbsp;&nbsp; 字段的组织顺序没有任何的规则<br>&nbsp;&nbsp; 本身定义的和通过继承的来的变量都被返回,但是不包含 static 变量<br>&nbsp;&nbsp; public Field getField(String name)<br>&nbsp;&nbsp;&nbsp; throws NoSuchFieldException, SecurityException<br>&nbsp;&nbsp; 返回指定名称的 public 字段<br>&nbsp;&nbsp; 如果没有直接的字段被发现，那父类或者接口被递归的查询<br>
<h2>使用字段 I</h2>
&nbsp;&nbsp; 如果 f 是 Field 对象, 那么<br>&nbsp;&nbsp; f.getName() 返回字段的简单的名字<br>&nbsp;&nbsp; f.getType() 返回字段的类型 (Class)<br>&nbsp;&nbsp; f.getModifiers() 返回字段的Modifier<br>&nbsp;&nbsp; f.toString() 返回一个包含了访问修饰符，类型，和全路径字段名字的字符串<br>&nbsp;&nbsp; 例如: public&nbsp; java.lang.String&nbsp; Person.name<br>&nbsp;&nbsp; f.getDeclaringClass() 返回定义字段的类的 Class 对象<br>
<h2>使用字段 II</h2>
&nbsp;&nbsp; obj 对象的字段的值可以使用下面的方式进行操作：<br>&nbsp;&nbsp; boolean f.getBoolean(obj),<br>int f.getInt(obj),<br>double f.getDouble(obj),<br>等等，返回字段的值，假设它是那个类型或者可以扩展成那个型<br>&nbsp;&nbsp; Object f.get(obj) 返回一个字段的值，假设它是一个对象<br>&nbsp;&nbsp; void f.set(obj, value),<br>void f.setBoolean(obj, bool),<br>void f.setInt(obj, i),<br>void f.getDouble(obj, d),等等，设置一个字段的值<br>
<h2>构造函数</h2>
&nbsp;&nbsp; 如果 c 是一个构造函数,那么<br>&nbsp;&nbsp; c.getName() 返回构造函数的名字，与类的名字完全一致<br>&nbsp;&nbsp; c.getDeclaringClass() 返回构造函数被声明的 Class 对象<br>&nbsp;&nbsp; c.getModifiers() 返回构造函数的 Modifier<br>&nbsp;&nbsp; c.getParameterTypes() 返回一个Class 对象数组, 以声明的顺序<br>&nbsp;&nbsp; c.newInstance(Object[] initargs) 创建被返回一个c类的实例对象<br>&nbsp;&nbsp; 需要使用简单类型的地方会被自动的转换<br>
<h2>方法</h2>
&nbsp;&nbsp; public Method[] getMethods()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws SecurityException<br>&nbsp;&nbsp; 返回一个 Method 对象数组<br>&nbsp;&nbsp; 返回的是类或接口的 public 成员方法，同时也包含继承的来的方法<br>&nbsp;&nbsp; 返回的方法没有任何的顺序<br>&nbsp;&nbsp; public Method getMethod(String name,<br>&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; Class[] parameterTypes)<br>throws NoSuchMethodException, SecurityException<br>
<h2>Method 中的方法 I</h2>
&nbsp;&nbsp; getDeclaringClass()<br>&nbsp;&nbsp; 返回一个Class 对象，它代表了这个Method 对象所被声明的类或接口<br>&nbsp;&nbsp; getName()<br>&nbsp;&nbsp; 返回代表这个Method 对象的名字，以字符串的方式<br>&nbsp;&nbsp; getModifiers()<br>&nbsp;&nbsp; 返回代表这个Method 对象的修饰符，以整型的方式<br>&nbsp;&nbsp; getParameterTypes()<br>&nbsp;&nbsp; 返回这个Method 对象所需要的参数的 Class 对象数组，以声明的顺序出现<br>
<h2>Method 中的方法 II</h2>
&nbsp;&nbsp; getReturnType()<br>&nbsp;&nbsp; 返回代表这个Method 对象的返回值的一个 Class对象名字<br>&nbsp;&nbsp; toString()<br>&nbsp;&nbsp; 返回一个代表这个Method 对象的字符串，通常情况下会很长<br>&nbsp;&nbsp; public Object invoke(Object obj, Object[] args)<br>&nbsp;&nbsp; 在特定的对象上使用特定的参数，执行这个Method对象所代表的方法<br>&nbsp;&nbsp; 个别的参数会被自动转换来实现一些对基本数据类型的需要<br>
<h2>数组 I</h2>
&nbsp;&nbsp; 可以采用下面的方法来判断一个obj 对象是不是一个数组<br>&nbsp;&nbsp; Class c = obj.getClass();<br>&nbsp;&nbsp; c.isArray()<br>&nbsp;&nbsp; 要取得这个数组的元素的类型可以使用,<br>&nbsp;&nbsp; c.getComponentType()<br>&nbsp;&nbsp; 如果c不是一个数组的话会返回一个 null<br>&nbsp;&nbsp; 在java.lang.reflect 包中包含了一个 Array 类，它提供了一些 static 方法来操作数组<br>
<h2>数组 II</h2>
&nbsp;&nbsp; 要创建一个数组,<br>&nbsp;&nbsp;&nbsp; Array.newInstance(Class componentType, int size)<br>&nbsp;&nbsp; 返回一个新创建的数组Object对象，<br>&nbsp;&nbsp; 你可以把它造型成你想要的类型<br>&nbsp;&nbsp; componentType 本身就可以是一个数组<br>&nbsp;&nbsp; 这会产生一个多维数组<br>&nbsp;&nbsp; 维数的最大限制一般在255<br>&nbsp;&nbsp; Array.newInstance(Class componentType, int[] size)<br>&nbsp;&nbsp; 返回一个新创建的多维数组Object对象 (使用 size.length 维度)<br>
<h2>数组 III</h2>
&nbsp;&nbsp; 得到数组元素的值<br>&nbsp;&nbsp; Array.get(Object array, int index) 返回一个 Object<br>&nbsp;&nbsp; Array.getBoolean(Object array, int index) 返回一个 boolean<br>&nbsp;&nbsp; Array.getByte(Object array, int index) 返回一个 byte<br>&nbsp;&nbsp; 等等.<br>&nbsp;&nbsp; 往数组中保存值,<br>&nbsp;&nbsp; Array.set(Object array, int index, Object value)<br>&nbsp;&nbsp; Array.setBoolean(Object array, int index, boolean z)<br>&nbsp;&nbsp; Array.setByte(Object array, int index, byte b)<br>&nbsp;&nbsp; 等等.<br>
<h2>结束语</h2>
&nbsp;&nbsp; 很多方法都有自己的异常，我在这里没有描述<br>&nbsp;&nbsp; 要查看详情，你参照Java API<br>&nbsp;&nbsp; 反射在&#8220;平常&#8221;的程序中用不到，可是你真的需要它的时候却是不可替代的。<br>&nbsp;&nbsp; 一个相关的话题－类的加载器(class loaders)—Java把需要的类读进内存<br>&nbsp;&nbsp; 你可以编写你自己的加载器<br>&nbsp;&nbsp; 这是别的大多数语言不包含的一种功能
<img src ="http://www.blogjava.net/youyu/aggbug/117917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youyu/" target="_blank">鱿鱼</a> 2007-05-16 19:20 <a href="http://www.blogjava.net/youyu/archive/2007/05/16/117917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>