Java基础——反射

来源:互联网 发布:手机网络爸爸 编辑:程序博客网 时间:2024/04/30 03:50

1. Class类:专门装载类的信息

类加载:由类加载器完成,类的Class文件读入内存后,就会创建一个Java.lang.Class对象,一旦某个类被载入JVM中同一个类就不会再次被载入

连接:把类的二进制数据合并到JRE

初始化:JVM负责对类进行初始化,也就是对静态属性进行初始化。在JAVA类中对静态属性指定初始值的方式有两种

1)声明静态属性时指定初始值

2)使用静态初始化块为静态属性指定初始值

2.反射就是运行时探究和使用编译时未知的类

使用步骤:(1)获得你想操作的类的Java.lang.Class对象

2)调用诸如getDeclaredMethods方法

3)使用reflection API来操作

具体:

1、反射第一步:获取Class对象

1)调用实例对象继承于ObjectgetClass方法

特点:A. 可以得到所有类和数组的Class对象

      B. 没有编译时未知,运行时探究的动态效果

2)利用语法类型名.class的方式获取到Class对象

特点:A. 所有类型(不管是基本数据类型还是引用数据类型,甚至是返回类型void)都可以得到相应的Class对象

B. 没有编译时未知,运行时探究的动态效果

3)利用Class.forName("字符串形式的类型名")获取Class对象

特点:A. 不支持基本数据类型、返回类型和数组获取相应Class对象

      B. 拥有编译时未知,运行时探究的动态效果

2. 探究类的信息

1)探究类的基本声明部分

.getPackage().getName()  //探究包名

.getName();  //探究类全名、类的限定名

.getModifiers();  //得到修饰符--访问修饰符和可选修饰符的组合

Modifier.toString(a); //使用工具类把整型的修饰符表示转换为字符串的修饰符表示

.getSuperclass().getName();  //得到父类

.getInterfaces();  //得到接口

2)探究属性—Field

.getFields();//得到所有的公共属性(包括父类继承而来的公共属性)

.getDeclaredFields();//得到所有申明的属性(不包括来自父类的)

.getField("name");//得到指定的公共属性(包括父类继承而来的);

.getDeclaredField("age");//得到指定的申明属性(不包括来自父类的)

3)探究构造---Constructor

.getConstructors();//得到所有公共的构造方法

.getDeclaredConstructors();//得到所有申明的构造

.getConstructor();//得到指定公共构造

.getDeclaredConstructor(String.class,int.class,boolean.class);//得到指定申明构造

Modifier.toString(con.getModifiers());//构造方法修饰符

.getParameterTypes();//得到形参列表

4)探究方法---Method

基本如同构造,只是Constructors换成Method

3. 使用探究到的类的信息

1)使用反射创建对象----Java中第三种创建对象的方法---newInstance()

A. 根据探究到的Constructor对象,产生类的实例对象

好处:可以调用类中任意构造方法

坏处:实现过于麻烦

setAccessible(true);//设置访问权限为可访---不到万不得已不准用

newInstance();//这个方法在反射中用来产生实例对象的

2)直接利用Class对象产生实例对象

好处:代码简洁

坏处:只能调用公共无参构造

3)操作属性---get/set

theField.set(dog1,"小白");//Field对象赋值,第一个参代表给哪个狗对象的name属性赋值

theField.get(dog0));//Field对象取值

4)调用探究到的方法---invoke()

.getDeclaredMethod("方法名",参数class对象);

.invoke(对象,参数);//调用方法

0 0