| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 917 人关注过本帖
标题:[分享]java.lang包的学习笔记一 (反射)
只看楼主 加入收藏
luoxian_2003
Rank: 1
等 级:新手上路
威 望:2
帖 子:163
专家分:0
注 册:2006-2-22
收藏
 问题点数:0 回复次数:0 
[分享]java.lang包的学习笔记一 (反射)


java.util包的学习笔记一

java.util包的学习笔记二(Collection框架)

java.lang包介绍:
提供利用 Java 编程语言进行程序设计的基础类。最重要的类是 Object(它是类层次结构的根)和 Class(它的实例表示正在运行的应用
程序中的类)。

1.Object
这是所有类的超类,包括的函数我们有必要全部了解,除去一个不带参数的构造器外共有11个函数下面我们来熟悉一下:
protected Object clone()创建并返回该对象的拷贝;
boolean equals(Object 0)很简单,判断是否相等; 但是JDK总结出来的规律很正规,看到这里使我想到我们学习高数时候,equals具有很多性质,自反性(reflexive),对称性(symmetric),传递性(transitive),一致性(consistent),还有一个对于任何非空引用值 x,x.equals(null) 都应返回false。
protected void finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。一般不涉及;
Class getClass() 返回此Object运行时的类;
void notify() ,void notifyAll() 用于唤醒在此对象监视器上等待的单个线程和多个进程;
void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
void wait(long timeout) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。(关于线程的知识涉及见条目 )
void wait(long timeout, int nanos) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
String toString() 返回字符串表示
int hashCode() 返回该对象的哈希码值。

2.反射(reflect)
这段主要讲叙的是java.lang.reflect包中的内容,Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身 进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并显示出来。
涉及到的类有Array, Class ,Constructor, Method, Field,Modifier

1)首先我们来学习下Array这个类,它的方法全部为静态方法,包括根据索引来访问数组的值,包括一系列的get[Int,Char,Boolean..] 和set[Int,Char,Byte,Double](Object,int,..)这些方法的Object参数只能是基本类型(primary type)类型,对与其它的类型可以用 get(),set()方法访问,但是他们返回的是Object类型。

2)
关于Class类没有公共的构造方法,通过静态方法forName(String)产生一个Class对象,有了这个对象我们可以由它获得该String类的 一些信息,例如,构造函数,一般函数,属性,函数的参数等等信息。
关于这部分的类的练习最好得方法莫过于写一个工具,可以产生类的一些信息了,以下是我写的一个工具版本为1.0,这个工具还有很多的改进的地方,大家有兴趣的可以一起来完善。

//Getproperties.java
package mycom;

import java.lang.reflect.*;

/**
* the tools of looking for the properties of a class
* print the constructor and method
*
* @author Roy
* @since 2007-09-10
* @version 1.0
*/
public class GetProperties {
/**
* return the parameters of the specified methods,constructors or fields fit
* the jdk1.4
*
* @param acceObject AccessibleObject
* @return
*/
private static String getParameter(AccessibleObject acceObject) {
String result = "";
Class[] parameters = null;
if (acceObject instanceof Method) {
parameters = ((Method) acceObject).getParameterTypes();
}
if (acceObject instanceof Constructor) {
parameters = ((Constructor) acceObject).getParameterTypes();
}
int paramCount = parameters.length;
// if no parameters
if (paramCount < 1) {
return result;
}
StringBuffer str = new StringBuffer();

for (int i = 0; i < paramCount; i++) {
String s = parameters[i].getName();// generally,the s is contain

str.append(getShortName(s)).append(",");
}
if (str.length() > 1)//delete the last ","
result = str.substring(0, str.length() - 1);

return result;
}
/**
* print the field
* @param object Class
*/
public static void printFields(Class object){
System.out
.println("----------------------Fileds----------------------");
StringBuffer str = new StringBuffer();
Field[] field = object.getDeclaredFields();

for(int i=0;i<field.length; i++){
int type =field[i].getModifiers();
str.append(Modifier.toString(type)).append(" ");

Class declared =field[i].getType();
str.append(getShortName(declared.getName())).append(" ");
str.append(field[i].getName()).append("\n");
}
System.out.print(str.toString());
}

/**
* print the construct function and its parameters
*
* @param object Class
* @return
*/
public static void printConstructs(Class object) {
System.out
.println("----------------------Constructors----------------------");

Constructor[] cos = object.getConstructors();
for (int i = 0; i < cos.length; i++) {
System.out.print(cos[i].getName() + "(");
System.out.print(getParameter(cos[i]));
System.out.print(")" + "\n");

}
}

/**
* print the declared method and its parameter
*
* @param object Class
*/
public static void printMethods(Class object) {
System.out
.println("----------------------Methods----------------------");
StringBuffer str = new StringBuffer();
Method[] methods = object.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
int type = methods[i].getModifiers();// Returns the Java language
// modifiers
// The Modifier class should be used to decode the modifiers
if(type != 0)
str.append(Modifier.toString(type)).append(" ");

str.append(getShortName(methods[i].getReturnType().getName()))
.append(" ");
str.append(methods[i].getName()).append("(").append(
getParameter(methods[i]));
str.append(")").append("\n");

}
System.out.println(str);
}

/**
* if the return type is a array,the str is "[*", for example the
* function" int[] getNumber(){..}" the
* "methods[i].getReturnType().getName()" equals "[I"
*
* @param str String
*/
private static String getShortName(String str) {

StringBuffer result = new StringBuffer();
int i = -50;
if (str.indexOf("[") != -1) {//array type
if (str.length() == 2) {
switch (str.charAt(1)) {
case 'B':
result.append("byte[]");
break;
case 'S':
result.append("short[]");
break;
case 'I':
result.append("int[]");
break;
case 'C':
result.append("char[]");
break;
case 'J':
result.append("long[]");
break;
case 'F':
result.append("float[]");
break;
case 'D':
result.append("double[]");
break;
}
} else {
if ((i = str.lastIndexOf(".")) != -1) {//because the end of the str is ";"
result.append(str.substring(i + 1,str.length()-1)).append("[]");
}
}
} else {//no array type
if ((i = str.lastIndexOf(".")) != -1) {
return str.substring(i + 1);
}
return str;
}
return result.toString();
}

public static void main(String[] args) throws Exception {
if(args.length<1){
StringBuffer str=new StringBuffer();
str.append("usage:java GetProperties ARGS").append("\n");
str.append(" the args contain the package:").append("\n");
str.append("example: java GetProperties java.lang.String");
System.out.println(str.toString());
System.exit(0);
}

//test:
//Class object = Class.forName("java.lang.reflect.Modifier");

Class object = Class.forName(args[0]);
printFields(object);
printConstructs(object);
printMethods(object);
}
}

这个工具很有用,我把它打包放在我的工具库,然后在classpath里加上它的路径,就可以象使用JDK的API一样的使用它了,在下一章节的基本类型的封装类的分析对比很方便。在下一节还要使用到的时候再详细说明。
同时如果大家对此感兴趣得话可以改进这个程序,我后续会对这个程序进行改进。





[此贴子已经被作者于2007-9-23 11:22:18编辑过]

搜索更多相关主题的帖子: java lang 笔记 反射 分享 
2007-09-23 11:18
快速回复:[分享]java.lang包的学习笔记一 (反射)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042648 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved