阅读目录
一、Class类的使用
二、动态加载类
三、获取方法信息
四、获取成员变量、构造函数信息
五、方法的反射
六、通过反射了解集合泛型的本质
一、Class类的使用
1)在面向对象(oop)的世界里,万事万物皆对象。
在Java中,包括基本的数据类型,都是对象。
Class c = int.class;//int 的类类型
那就是说:
类是对象,类是java.lang.Class类的实例对象。这个对象我们称之为类类型。
换言之,每一个类都有一个类类型,这个类类型就是java.lang.Class的实例对象
2)如何获取一个类的类类型(三种方法)
类名.class;
类的对象.getClass();
Class.forName(“类的全称包含包名”);
class Foo{}
Foo foo1=new Foo();
1. Class c1 = Foo.Class;//任何一个类都有一个隐含的静态成员变量class
2. Class c2 = foo1.getClass()//已经知道该类的对象通过getClassF方法
3. Class c3 = null;
c3 = Class.forName("com.immoc.reflect.Foo");
//of course, c1 == c2 == c3 is true
3)利用类类型来创造实例对象(需要有无参数的构造方法)(需要有强制类型转化,且有异常抛出)
Foo foo2 = (Foo)(c1.newInstance());
Foo foo3 = (Foo)(c2.newInstance());
Foo foo4 = (Foo)(c3.newInstance());
1 packagecom.study.reflect;
2
3 /**
4 * @description 6 * @date 2016-3-28 下午4:06:29
7 */
8 public classClassDemo1 {
9
10 public static voidmain(String[] args){
11 //Foo的实例对象如何表示?
12 Foo foo1=new Foo();//foo1就表示Foo的实例对象
13 //Foo这个类也是一个实例对象,它是Class类的对象,那Class类的实例对象,如何表示呢?
14 //任何一个类都是Class的实例对象,但是不能通过new关键字来创建。这个实例对象有三种表示方式:
15
16 //第一种表示方式---->实际是在告诉我们任何一个类都有一个隐含的静态成员变量class
17 Class c1=Foo.class;//如果Foo已经存在,可以用这种方法来创建Foo的类类型(class type),即Foo类的类类型就是Class类的一个实例对象。
18
19 //第二种方式-->已知该类的对象,通过getClass方法
20 Class c2=foo1.getClass();//如果Foo类的对象foo1已经存在,可以通过这种方法来创建Foo类的类类型。
21
22 /**
23 * 上面官网说c1,c2 是表示了Foo类的类类型(class type)---->指的就是Class的对象
24 * 类类型,即万事万物皆对象,
25 * 类也是一个对象,是Class类的实例对象
26 * 这个对象我们把它称为该类的类类型
27 */
28
29 //不管c1 or c2,他们都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
30 System.out.println(c1==c2);//true
31
32 //第三种表示:
33 Class c3=null;
34 try{
35 c3=Class.forName("com.study.reflect.Foo");//通过Foo的全称来创建
36 } catch(ClassNotFoundException e) {
37 e.printStackTrace();
38 }
39 System.out.println(c2==c3);//true
40
41 //我们完全可以通过类的类类型创建该类的对象实例-->通过c1 or c2 or c3 创建Foo的实例
42 try{
43 //如果c1是A类的类类型,创建的就是A类的实例对象,所以需要做强制类型转换,也会有异常
44 Foo foo = (Foo) c1.newInstance();//这个前提要求是需要有无参数的构造方法
45 foo.print();
46 } catch(InstantiationException e) {
47 e.printStackTrace();
48 } catch(IllegalAccessException e) {
49 e.printStackTrace();
50 }
51 }
52
53 }
54 classFoo{
55 voidprint(){
56 }
57 }
二、动态加载类
首先区分什么是动态加载和静态加载。
也就是区分编译和运行。
new 创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类
通过动态加载类可以解决该问题。通过类类型创建该类的对象
1、静态加载类,是编译时刻加载;动态加载类,是运行时刻加载
2、new创建对象