Java反射

来源:互联网 发布:nginx只允许域名访问 编辑:程序博客网 时间:2024/05/21 15:02
反射:
加载类:Class.forName("类名");

1、反射是什么

2、反射做什么
类加载时首先加载到内存当中,然后产生一个Class类对象,一个类的Class对象只有一个
类模板对象:Class:专门装载(记录)类的信息,以对象的方式存放,JVM使用,只被加载到Class对象一次。
3、反射与动态多态的关系

类模板对象只有一个
实例对象可以有无数个(new Student())

连接:把类的二进制数据合并到JRE中
初始化:JVM负责对类进行初始化,也就是对静态属性进行初始化

反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。

反射机制API:运行时探究和使用编译时未知的类

反射使用步骤:
1、获得你想操作的类的java.lang.Class 对象(3种方式获取)
1、调用实例对象继承于Object的getClass()方法
1、可以的到所有类和数组的Class对象
2、虽然可以得到Class对象,但是没有编译时未知,运行时探究的动态效果
2、利用语法:类型名.class的方式获取到Class对象
1、所有类型(不管是基本数据类型还是引用数据类型,甚至是返回类型void)都可以得到相应的Class对象
(基本数据类型.class只能在JDK1.5以后使用JDK1.5之前获取基本数据类型的Class对象:包装类.TYPE)
2、虽然可以得到Class对象,但是没有编译时未知,运行时探究的动态效果
3、利用Class.forName("字符串形式的类型名");获取Class对象:(动态加载)Class.forName:加载完毕交给虚拟机
1、不支持基本数据类型、返回类型void和数组获取相应的Class对象
2、拥有编译时未知,运行时探究的动态效果

2、(探究类的信息)属性、构造、方法


1、探究类的基本声明部分:
Class对象.getPackage().getName();包全名
Class对象.getName();类全名、类的限定名
Class对象.getSimpleName();得到类名
Class对象.getModifiers();得到修饰符(访问修饰符+可选修饰符) 返回int
Modifier.toString(int);使用工具类把int类型修饰符表示转换为字符串的修饰符表示
Class对象.getSuperclass();得到父类Class对象
Class对象.getInterfaces();得到Class对象数组(因为类可以多实现接口)
2、探究属性 Field对象:
Class对象.getFields();得到所有的公共属性(包括父类继承而来的公共属性) 返回一个Field [];
Class对象.getField("属性名");得到指定的公共属性(包括父类继承而来的公共属性) 返回一个Field
Class对象.getDeclaredFields();得到所有声明的属性(不包括来自父类的) 返回一个Field [];
Class对象.getDeclaredField("属性名");得到指定的声明属性(不包括来自父类的) 返回一个Field;

Field.getName();属性名
Field.getType();属性类型,返回Class,再调用Class的getSimpleName()得到类名
Modifier.toString(Field.getModifiers);修饰符




3、探究构造:Constructor对象:
Class对象.getConstructors();得到所有的公共构造 返回一个Constructor [];
Class对象.getConstructor();得到指定公共构造 返回一个Constructor;
Class对象.getDeclaredConstructors();得到所有声明的构造 返回一个Constructor [];
Class对象.getDeclaredConstructor(参数列表);得到指定声明构造 返回一个Constructor;

Modifier.toString(Constructor对象.getModifiers);修饰符
Constructor对象.getName()方法名 -- 真正的构造方法名就是类全名
Constructor对象.getParametersTypes();形参列表 返回Class [] , 再调用Class的getSimpleName()得到类名
Constructor对象.getExceptionTypes();抛出的异常 返回Class [],再调用Class的getSimpleName()得到类名
4、探究方法:Method对象:
Class对象.getMethods();得到所有的公共方法 返回一个Method [];
Class对象.getMethod();得到指定公共方法 返回一个Method;
Class对象.getDeclaredMethods();得到所有声明的方法 返回一个Method [];
Class对象.getDeclaredMethod(方法名 , 参数列表);得到指定声明方法 返回一个Method;

Modifier.toString(Method.getModifiers);修饰符
Method对象.getName()方法名
Method对象.getReturnType()返回类型
Method对象.getParametersTypes();形参列表 返回Class [] , 再调用Class的getSimpleName()得到类名
Method对象.getExceptionTypes();抛出的异常 返回Class [],再调用Class的getSimpleName()得到类名

3、使用探究到的类的信息
1、使用反射创建对象 -- Java中第三种创建对象的方式
1、根据探究到的Constructor对象,产生实例对象
好处:可以调用任意构造方法
坏处:实现过去麻烦
Constructor对象 . newInstance(实参列表);这个方法在反射中用来产生实例对象的 返回一个Object对象(受访问修饰符的限制)
Constructor对象 . setAccessible(true);设置这个构造方法对象的访问权限为可访---不到万不得已不准用!
2、直接利用Class对象产生实例对象
好处:代码简洁
坏处:只能调用公共无参构造
Class对象 . newInstance();产生实例对象

2、操作属性:
得到属性对象Field
Field对象 . set( 需要赋值的对象 , 值 );给Field对象赋值,第一个参数代表给指定的对象属性赋值
Field对象 . get( 取哪个对象的值);得到Field中指定对象的值
Field对象 . setAccessible(true);设置这个属性对象的访问权限为可访---不到万不得已不准用!

3、调用探究到的方法 --- invoke():
得到方法对象Method
方法对象 . invoke(调用指定对象);使用指定对象的方法
Field对象 . setAccessible(true);设置这个方法对象的访问权限为可访---不到万不得已不准用!

当数组做参数的时候,使用 类型... 的方式定义形参,这样做实参传递过来会自动封装成一个数组,调用者不用考虑参数个数:
数组传参语法糖: 方法(int... array)
0 0
原创粉丝点击