反射基本的概念和用法1

反射的概念
1.java反射机制是在运行状态中,对于任何一个类,都能知道这个类的所有属性和方法
对于任何一个对象,都能调用他的任意一个方法和属性,这种动态获取信息以及动态
调用对象调用对象的方法的功能称为java语言的反射机制


2.要解剖一个类,必须先要获取该类的字节码文件对象
而解剖使用的就是Class类中的方法,所以先要获取到每个字节码文件
对应的Class类型的对象


对上面的总结简单一点就是:
通过一个类的.class文件对象,去使用该类中的成员变量,构造方法,成员方法
要想这样使用,首先你必须得到class文件对象,其实也是得到Class类的对象




一:Class的定义
Class类的实例表示正在运行的java应用程序中的类和接口
【类(枚举), 接口(注解), 数组类,基本类型或void】
a.每个数组属于被映射为Class对象的一个类
b.java中的基本数据类型和void也表示Class对象




二 :获取到Class对象的三种方式
a.对象名.getClass(); //因为对象是类的实例,而这个肯定直接或间接的继承了Object根类,而Object里就有该方法
b.类.class //说类还不是特别准确,应该说是数据类型的静态属性.class,就是说不管是基本的类型还是引用的都有这个静态属性class
c.Class.forName("类路径"); //就是包名.类名


三:反射对成员变量,构造方法,成员方法的基本操作
Class类中
a.成员变量: Field (类)
b.构造方法: Constructor(类)
c.成员方法: Method(类)

四:如何获取Field类,Constructor类,Method类并使用里面的方法(反射里面方法带了s的,返回值都是数组,没带s的一般要加参数,加了Declared单词就是访问所有的)
A:获取Field类和使用里面的操作方法
1.public Field[] getFields() //只能得到被public修饰的成员变量,返回的是一个Field数组,
2.public Field[] getDeclaredFields(); //可以得到表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段
3.public Field getField(String name)throws NoSuchFieldException; //要你填一个属性(成员变量)名,必须是public修饰的,否则会报NoSuchFieldException:没有这个属性异常
4.public Field getDeclaredField(String name); 如果传了一个被私有修饰的属性则会报IllegalAccessException:非法访问异常,如何解决这个问题呢,可以使用Field类从父类
java,lang.reflect.AccessibleObject类中继承过来的 setAccessible(true)方法,j就可以暴力访问了

Field类中常用的方法(其他的可以查询API)
1.public int getModifiers() 字段中的权限修饰符,返回值是整型 1代表public, 4代表protected, 0代表默认,2代表私有
2.public Class getType() 字段的类型
3.public String getName() 字段中的名称


B:获取Constructor类和使用里面的操作方法(构造方法)
1.public Constructor[] getConstructors(); 只能访问被public修饰的构造方法,返回的是一个Constructor[]
2.public Constructor[] getDeclaredConstructors(); 可以返回该类或接口中的所有构造方法,包括私有
3.public Constructor getConstructor(Class... parameterTypes); //要你填一下构造方法参数对象的.class,必须是public修饰的构造方法,否则会报NoSuchMethodException:
4.public Constructor getDeclaredConstructor(Class... parameterTypes); 如果传了一个私有的构造对应的参数.class进去,就会报IllegalAccessException:非法访问异常,解决setAccessible(true)

Constructor类中常用的方法
1.public int getModifiers() 构造方法中的权限修饰符,返回的是一个整数
2.public String getName() 以字符串形式返回此构造方法的名称 其实返回的是一个类路径
3.public T newInstance(Object... initargs)使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例


C:获取Method类和使用里面的方法(成员方法)
1.public Method[] getMethods();返回的是本类和父类的【公共】的成员方法
2.public Method[] getDeclaredMethods();只能访问本类中所有的成员方法,不包括构造方法
3.public Method getMethod(String name,Class... parameterTypes); 只能获取被public修饰的成员方法,参数填对应参数类型的.class,没有参数就不用填
4.public Method getDeclaredMethod(String name, Class... parameterTypes); 除了访问私有的成员方法会报IllegalAccessException,解决方法:只要是想访问私有的,不管的属性还是构造方法,成员方法都要加SetAccessible(true);

Method类常用的方法
1.public int getModifiers()
2.public String getName()
3.public Object invoke(Object obj, Object... args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法

反射的精美脑图自己总结的:链接:https://pan.baidu.com/s/1Vb9g94QF_7goP3gETgtPFQ 
提取码:actv 
复制这段内容后打开百度网盘手机App,操作更方便哦


















 

你可能感兴趣的:(JAVASE进阶知识)