Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1652581
  • 博文数量: 1481
  • 博客积分: 26784
  • 博客等级: 上将
  • 技术积分: 17045
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-12 09:22
文章分类

全部博文(1481)

文章存档

2014年(10)

2013年(353)

2012年(700)

2011年(418)

分类: IT职场

2013-01-07 11:03:37

一.何为类型信息,顾名思义即一个类的信息。

一个类有类名,即它的一个标识,有成员变量,构造器,方法组成。

它还有父类,继承的接口

还有对接口实现的方法(动作),对父类方法的重写。
总结起来类型信息有,自己的名字,(继承的父类,实现的接口)。自己的成员变量,自己的方法。
Bruce Eckel 在《Thinking in Java》言“一切都是对象”。类就是描述这一切对象的。我们描述的每一个对象都可以创建成一个类。
例子:当我们描述一只狗时。小狗(类名),它有四条腿(成员变量),它的动作有汪汪叫(方法),在这里它的父类指的不是这只小狗的父母,而是狗这个描述,父类是根据一系列对象的抽象的描述。就像狗是小狗的一个抽象描述(狗是我们对狗这一类实体的描述)。
接口是我们对对象的动作规范描述。
二.运行时我们可以得到类型信息这就要说到反射了!动态地生成一个类,并调用其方法或修改其域(甚至是本身声明为private的域或方法)。
1 先在说一个特殊的类。描述类的类。就是当我们提到的小狗,四条腿这些描述的时候。系统会为这些描述创建一个类。这个类就是描述类的类即Class。Class类本身表示Java对象的类型。Class类是整个Java反射机制的源头。一切关于Java反射的故事,都从Class类开始。
2 获取Class的对象有几种方法:
        1.getClass()    每个类都有此函数
        2.静态方法    Class.getSuperclass()
        3.  .class 语法
3对于类的描述还有三个类要说:分别是构造器、成员函数、成员变量。类描述的三个成员封装的类。
    1.构造器Constructor 一切都是对象,那么构造器就是创建一个对象生命的开始,即产生一个对象生命.一个对象的产生有多种表现形式,所以一个类可以有多种或一种构造器来构造生命必须有一种,不然生命将不能诞生这是java不允许的,如果没有写构造器系统会默认无参构造器。
        反射可以让我们得到一个类的各种中构造器,所以可以说反射有了孵化生命的能力(是孵化不是创造是因为反射不能再没有类型信息的情况下创建一个具有某个类型信息的对象)。
    2.方法Method (动作)构造函数是创造一个生命,那么方法就是这个对象存在后的行为,动作。一个对象的存在绝大部分意义在于它的动作。
    反射可以帮我们得到对象的方法,也就是说我们可以践行一个对象的生命意义。
    3.成员变量,经常叫做一个对象的域。成员变量是真正构造一个对象的细胞。成员变量在内存中占用的空间总和这个对象占用的内存空间基本一致。
一个例子:可以用反射得到一个类的类型信息。输入一个全类名,打印出这个类

1 package lang.reffection;
2 import java.lang.reflect.Constructor;
3 import java.lang.reflect.Field;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.Modifier;
6 import java.util.Scanner;
7 /**
8 * 打印一个类的构造器,字段,方法
9 * @author Administrator
10 *
11 */
12 public class ReflectionTest {
13 public static void main(String[] args) {
14 String name;
15 if(args.length > 0)
16 name = args[0];
17 else{
18 System.out.println("请输入全类名");
19 Scanner in = new Scanner(System.in);
20 name = in.next();
21 }
22
23 Class cl;
24 try {
25 cl = Class.forName(name);
26 Class supercl = cl.getSuperclass();
27 String modifiers = Modifier.toString(cl.getModifiers());
28 if(modifiers.length() > 0)
29 System.out.print(modifiers + " ");
30 System.out.println("class " + name);
31
32 if(supercl != null && supercl != Object.class)
33 System.out.println(" extends " + supercl.getName());
34
35 System.out.println("{");
36 printConstructors(cl);
37 System.out.println();
38 printMethods(cl);
39 System.out.println();
40 printFields(cl);
41 System.out.println("\n}");
42
43 } catch (ClassNotFoundException e) {
44 e.printStackTrace();
45 }
46
47
48 }
49
50 /**
51 * 打印构造器
52 * @param cl
53 */
54 public static void printConstructors(Class cl){
55
56 Constructor[] constructors = cl.getDeclaredConstructors();
57
58 for(Constructor c : constructors){
59
60 String name = c.getName();
61 System.out.println(" ");
62 String modifiers = Modifier.toString(c.getModifiers());
63 if(modifiers.length() > 0)
64 System.out.print(modifiers + " ");
65 System.out.print(name + " ( ");
66
67 Class[] paramTypes = c.getParameterTypes();
68 for(int i = 0; i < paramTypes.length; i++){
69 if(i > 0)
70 System.out.print(", ");
71 System.out.print(paramTypes.getName());
72 }
73 System.out.print(");");
74 }
75 }
76
77 /**
78 * 打印方法
79 * @param cl
80 */
81 public static void printMethods(Class cl){
82 Method[] methods = cl.getDeclaredMethods();
83
84 for(Method m : methods){
85 Class retType = m.getReturnType();
86 String name = m.getName();
87
88 System.out.println(" ");
89
90 String modifiers = Modifier.toString(m.getModifiers());
91 if(modifiers.length() > 0)
92 System.out.print(modifiers + " ");
93 System.out.print(retType.getName() + " " + name + " ( ");
94
95 Class[] paramTypes = m.getParameterTypes();
96 for(int i = 0; i < paramTypes.length; i++){
97 if(i > 0)
98 System.out.print(",");
99 System.out.print(paramTypes.getName());
100 }
101 System.out.print(");");
102 }
103 }
104
105 public static void printFields(Class cl){
106 Field[] fields = cl.getDeclaredFields();
107
108 for(Field f : fields){
109 Class type = f.getType();
110 String name = f.getName();
111 System.out.println(" ");
112
113 String modifiers = Modifier.toString(f.getModifiers());
114 if(modifiers.length() > 0)
115 System.out.print(modifiers + "");
116 System.out.print(type.getName() + " " + name + ";");
117 }
118 }
119 }
三。“论”反射,让java动起来。
java被称为"准动态语言";那么什么是动态语言呢?百度一下“动态语言”,解释如下:动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。
java怎样被称为了准动呢!因为Java语言允许使用者在运行时加载、探知、使用编译期间完全未知的classes。这就让java动了起来。但他却是准动的。不能在运行期间改变动作,但可以探知一个动作。从上面的例子看,已经可以获取类中最重要的三个信息。这些并没有涉及到对象的内存,在程序编译完成的那一刻起,一切都已经是确定的了。因此,它并不能算“动态”。而如何对对象内存进行操作和访问,才是“动”的真正含

原文地址:

阅读(278) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~