写在前面:在面向对象的世界里(普通数据类型和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);//绕过编译就绕过了泛型,加入成功