反射

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中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译无效

 

posted @ 2018-08-31 14:57  言西早石头侠  阅读(121)  评论(0编辑  收藏  举报