反射基本的概念和用法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<T> getConstructor(Class<?>... parameterTypes); //要你填一下构造方法参数对象的.class,必须是public修饰的构造方法,否则会报NoSuchMethodException:
4.public Constructor<T> 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,操作更方便哦


















 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值