标签:style blog color java io strong ar for 数据
1.Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?
这个类的名字就是Class,要注意与小写class关键字的区别哦。Class类描述了哪些方面的信息呢?
类的名字,类的访问属性,类所属于的包名,字段名称的列表、方法名称的列表,等等。
学习反射,首先就要明白Class这个类。写如下代码进行对比理解:
/*Person p1 = new Person("zhangsan"); Person p2 = new Person("lisi"); */ /*Class x1 = Vector类在内存里的字节码 Class x2 = Date类在内存里的字节码*/ Class x1 = Vector.class; Class x2 = Date.class;
每个java类都是Class的一个实例对象,它们的内容不同,但是,它们的特征相同,譬如,都有方法,有字段,有父类,有包。
2. ******讲课时要一定画一张图:多个类的字节码装载入内存,在内存中加入一个个方块空间表示字节码,然后用一个个椭圆表示以这个字节码创建出来的实例对象,并用监视代码来说明字节码只被装载一次,而它构造的实例对象的构造方法被调用了多次。
用如下代码更进一步说明Class的实例是什么?是一份字节码,一个类在虚拟机中通常只有一份字节码:
Date d1 = new Date(); Class clazz1 = d1.getClass(); Class clazz2 = Date.class; Class clazz3 = null; clazz3 = Class.forName("java.util.Date"); if(clazz1==clazz2) { System.out.println(clazz1.getName()); } if(clazz1==clazz3) { System.out.println(clazz1.getName()); }
3.一个奇怪的问题:加载了字节码,并调用了其getMethods之类的方法,但是没有看到类的静态代码块被执行,只有在第一个实例对象被创建时,这个静态代码才会被执行。
准确的说,静态代码块不是在类加载时被调用的,而是第一个实例对象被创建时才执行的。
Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
String str = new String(new StringBuffer("abc"));
String str = (String)constructor.newInstance(new StringBuffer("abc"));
2. 一个类有多个构造方法,用什么方式可以区分清楚想得到其中的哪个方法呢?根据参数的个数和类型,例如,Class.getMethod(name,Class... args)中的args参数就代表所要获取的那个方法的各个参数的类型的列表。重点:参数类型用什么方式表示?用Class实例对象。例如:
int.class,(int []).class
int [] ints = new int[0];
ints.getClass();
Constructor对象代表一个构造方法,大家觉得Constructor对象上会有什么方法呢?得到名字,得到所属于的类,产生实例对象。
3. 讲解创建实例对象时,先应该举例说说通常情况下是怎样做的, String str = new String(new StringBuffer(“abc”));在源程序中用注释方式给出传统方式的代码,以便对比提醒程序阅读者。
然后再说用反射如何做
String str = (String)constructor.newInstance(/*"abc"*/new StringBuffer("abc"));
System.out.println(str);
讲反射方式创建实例对象时,先故意用string作为参数传进去,根据错误让大家感受到确实是那个构造方法,然后再改为传一个StringBuffer类型的参数进去, String str = (String)constructor.newInstance(/*"abc"*/new StringBuffer("abc"));
好比,我叫来一个吃人不吃草的恐龙,等到它要吃东西时,我得给他送真人去了吧。
标签:style blog color java io strong ar for 数据
原文地址:http://www.cnblogs.com/lkzf/p/3943337.html