写在前面:在面向对象的世界里(普通数据类型和Java静态的东西不是面向对象),万事万物皆对象,类也是对象,是java.lang.Class对的实例对象,它的实例是每一个对象

 

反射机制:动态加载类:

====================Class类的使用=================================

Class类的使用:

(1)获取类类型 Class:

   1.类名.class;

   2.对象.getClass();

   3.Class c = Class.forName("com.reflect.Word");

 (2)通过 Word 2 =new  Word();对象,是静态的加载类 ,是在编译时刻需要加载所有可能会用到的类。

而通过反射Class c = Class.forName("com.reflect.Word");动态加载类,在运行时加载;

Word w = (Word)c.newInstance();通过类类型,创建该类对象。

总结:功能性的类使用动态加载(可以有助于程序的设计)

(3)基本数据类型,void关键字都存在类类型

  1.Class c1 = int.class//int 的类类型

  2.Class c2 = String.class//String 类的类类型

  3.Class c3 = double.class;

  4.Class c4 = Double.class;

  5.Class c5 = void.class;

---------要想动态获取类的信息,首先获取该类的类类型-------------

(4)通过反射来获取到所有类的方法(public)的信息(方法也是对象 Method类,)

Method[] ms = c1.getMethods();//Method对象有其他方法可以获得方法的返回值类型,参数列表

类型,方法名,等)

(5)通过反射来获取到所有类的成员变量的信息(成员变量也是对象 Field)

Field[] fs = c1.getDeclaredFields();

(6)获取构造方法的信息(Constructor)

  Class c =obj.getClass();

Constructor[] cs=c.getDeclaredConstructors();//得到自己声明的构造函数

=============方法的反射=====================================

1)方法的获取(前面已介绍先获取类类型)

 Method m = c.getMethod(参数名,参数类类型列表数组)

2)方法的反射操作;

 m.invoke(该方法所属类的对象,args)

3)通过反射认识泛型的本质

//反射的操作都是在编译之后的操作,即运行时的操作

//编译之后集合的泛型是去泛型化的,Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了

例:

ArrayList list1 = new ArrayList();

ArrayList<String> list2 = new ArrayList<String>();

Class c1= list1.getClass();

Class c2=list2.getClass();

//c1==c2  true;

Method m = c2.getMethod("add",Object.class);

c2.invoke(list2,1);//绕过编译就绕过了泛型,加入成功