java基础-----反射

一、反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

什么是反射

反射就是把java类中的各种成分映射成一个个的Java对象

例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)。

如图是类的正常加载过程:反射的原理在与class对象。熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
在这里插入图片描述

反射方法

基本信息操作

int modifier = clazz.getModifiers(); //获取类的修饰符
Package package= clazz.getPackage();//获取类的包名
String fullClassName = clazz.getName();//获取类的全路径名称
String simpleClassName = clazz.getSimpleName();//获取类的简单名称
ClassLoader classLoader = clazz.getClassLoader();//获取类的类加载器
Class[] interfacesClasses = clazz.getInterfaces();//获取类实现的接口列表
Class fc= clazz.getSuperclass();//获取类的父类
Annotation[] annotations= clazz.getAnnotations(); //获取类的注解列表

反射-字段操作

Field[] fields = clazz.getFields();//获取类中所有的公有字段 包含继承
Field[] declaredFields=clazz.getDeclaredFields();//获取类中定义的字段 内部
Field nameField=clazz.getField("name");//获取指定名称的公有字段
Field likeDescField=clazz.getDeclaredField("likeDesc");//获取指定名称类中

定义的字段

int modifersFiled = likeDescField.getModifiers();//获取字段的修饰
nameField.setAccessible(true);//指定字段强制访问
nameField.set(person,"小皮皮");//成员字段赋值(需指定对象)
descriptionField.set(null,"没有结婚的都是男孩!");//静态字段赋值

反射-方法操作

Method[] methods = clazz.getMethods();//获取类中所有的公有方法 继承
Method[] declaredMethods = clazz.getDeclaredMethods();//获取类中定义的方法
Method talkMethod = clazz.getMethod("talk", String.class);//获取类中指定名称和参数的公有方法
Method pugMethod = clazz.getDeclaredMethod("pickUpGirls") //获取类中定义指定名称和参数的方法
int modifers = pugMethod .getModifiers();//获取方法的修饰符
talkMethod.invoke(boy,"I LOVE SEVEN");//指定对象进行成员方法的调用
pugMethod .setAccessible(true);//指定方法的强制访问
pickUpGirlsMethod.invoke(null);//静态方法的调用

反射-构造器操作

Constructor[] cons = clazz.getConstructors();//获取类中所有的公有构造器
Constructor[] cons = clazz.getDeclaredConstructors();//获取类中所有的构造器
Constructor conNoParam= clazz.getDeclaredConstructor();//获取类中无参的构造器
Constructor con= clazz.getDeclaredConstructor(String.class,String.class); //获取类中有参构造
int modifers = con.getModifiers();//获取构造器的修饰符
conNoParam.newInstance();//构造器实例对象
con.setAccessible(true);//指定方法的强制访问
con.newInstance('abc','def');//有参构造调用
class.newInstacne();//class直接调用默认无参构造

反射实例
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章