Class类
类是对象,类是java.lang.Class类的实例对象
任何一个类都是Class的实例对象,这个实例对象有三种表示方式
Foo foo=new Foo();
1) 实际告诉我们任何一个类都有一个隐含的静态成员变量class
Class class1=Foo.class;(由类名来生成类的类类型)
2) 已经知道该类的对象通过getClass方法
Class class2=foo.getClass();(由已知对象的getClass方法来生成类类型)
官网class1,class2表示了Foo类的类类型(class type)
万事万物皆对象
类也是对象,是Class类的实例对象
这个对象我们称为该类的类类型
不管class1,class2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
3)
Class class3=null; try { class3=Class.forName("com.tanlei.cn.Foo");(由类的路径来生成类的类类型) } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
我们完全可以通过类的类类型创建该类的对象实例
通过class1,class2,class3创建Foo的实例
try { Foo foo=(Foo) class1.newInstance();//需要有无参数的构造方法 } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); }
New 创建对象 是静态加载类,在编译时刻就需要加载所有的可能使用到的类
通过动态加载类可以解决该问题
成员变量的反射
成员变量也是对象
java.lang.reflect.Field
Field类封装了关于成员变量的操作
getFields()方法获取的是所有的public的成员变量的信息
getDeclaredFields获取的是该类自己声明的成员变量
得到成员变量的类类型getType()
构造函数的反射
java.lang.reflect.Constructor中封装了构造函数的信息
getConstructor获取所有public的函数
getDeclaredConstructor得到所有的构造函数
方法的反射操作
获取方法 名称和参数列表来决定
getMethod 获取的是public的方法
getDelcaredMethod自己声明的方法
方法的反射操作:用对象来进行方法调用 invoke()方法 方法没有返回值返回null,有返回的返回值返回具体的返回值
通过反射了解泛型的本质
集合的泛型是去泛型化的
Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译无效