java学习笔记之反射

1.在java语言中,静态的成员变量,普通数据类型类等等都是对象,类也是对象,是java.lang.Class类的实例对象,任何一个类都是Class的实例对象,称为这个类的类类型,这个实例对象有三种表达方式

(1)Class c1=类名.class  任何一个类都有一个隐含的静态成员变量class

(2)Class c2=类的实例.getClass()  知道该类的实例对象后用getClass()方法获取

(3)Class c3=null;

c3=Class.forName("类的全称");

c1=c2=c3,都代表了这个类的类类型,一个类只可能是Class类的一个实例对象,无论用哪种方法获取的都是同一个,我们可以通过类的类类型来创建对象实例,比如:

Foo foo=(Foo)c1.newInstance() 得出来的结果进行强制类型转换就可以得到对象实例,但前提是Foo类必须要有无参构造方法

2.加载类

(1)c3=Class.forName("类的全称")不仅仅代表了类的类类型,还代表了动态加载类,编译时刻加载类是静态加载类,运行时刻是动态加载类

(2)new创建类是静态加载类,在编译时刻就需要加载所有的可能用到的类,所以任何一个类出现问题都无法编译成功

(3)动态加载类在运行时加载,可能用到的类出错在编译时不会报错,只有在用到时才会报错,但所有可能用到的类必须继承同一个接口才能方便调用


java学习笔记之反射_第1张图片




java学习笔记之反射_第2张图片


java学习笔记之反射_第3张图片

3.基本的数据类型,void关键字也有类类型

Class c1=int.class;

Class c2=String.class;

Class c3=void.class;

4.方法也是对象,方法对象属于java.lang.reflect.Method类,一个成员变量就是一个Method类对象

Class c=obj.getClass();

c.getName();//获取类的名称

Method[] ms=c.getMethods();//获取所有的public函数的方法对象,包括从父类继承来的

而getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限,但不包括父类继承来的


java学习笔记之反射_第4张图片

5.成员变量也是对象,.成员变量对象属于java.lang.reflect.Field类,用法与方法对象类似


java学习笔记之反射_第5张图片

6.构造函数也是对象,java.lang.Constructor中封装了构造函数的信息,用法类似:


java学习笔记之反射_第6张图片

7.获取一个方法的信息

首先获取类的类类型,如:Class c1=类名.class

通过方法名称和参数来获取,如:Method m=c.getMethod("方法名",new Class[]{int.class,int.class})

或Method m=c.getMethod("方法名",int.class,int.class)

方法的反射操作:通过m对象来调用方法,与用对象实例调用效果相同,例:

m.invoke(a1,new Object[]{10,20))(a1为对象实例,new Object[]{10,20)为方法参数,没有可不写或为空new Object[]{}),效果等同于a1.方法名(10,20),如果有返回值,返回的是Object对象,要进行强制类型转换

8.java中反射的操作都是编译后的操作,而java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了,所以编译之后集合的泛型是去泛型化的,所以绕过编译可以绕过泛型

java学习笔记之反射_第7张图片

你可能感兴趣的:(java学习笔记之反射)