Java反射

Class类—代表字节码的类----代表类的类
Field—代表属性的类
Method—代表方法的类
Constructor—代表构造方法的类
Annotation—代表注解的类
Package—代表包的类
反射—本质上是去剖析类,获取类的字节码,产生类的实例对象

Class类

每一个Class对象实际上对应了一个类。

获取Class对象的三种方式:
1、通过类名.class来获取一个字节码对象
2、通过对象的getClass()方法来获取一个字节码对象
3、通过Class类的forName(String name)方法来获取一个字节码对象,传入的参数必须是完整路径(包名加类名)。

通过对应的Class对象获取对应的类的对象:
      Class类是不允许newClass对象的。Class类的构造方法是私有的,
      Class对象是在加载类的时候由Java虚拟机以及通过调用类的加载器的defineClass方法自动构造的。
1、如果使用的是Class对象对应类的空的构造方法,有两种方式:
      ①直接使用Class对象的newInstance()方法即可。
      ②先用Class对象的getConstructor()方法获得空的构造函数,再调用构造函数的newInstance()方法获得对象。
2、如果使用的是Class对象对应类的含参的构造方法:
      ①先用Class对象的getConstructor()方法获得含参的构造函数(方法中传入对应的参数类型的class),再调用构造函数的newInstance()方法(传入具体值)。

Class对象获取构造方法的方式

getConstructors()
返回一个包含某些(也就是只是公共构造方法)Constructor 对象的数组。

getConstructor(Class<?>…parameterTypes)
返回指定公共构造方法的 Constructor对象。(传进的参数是可变参数,可以获取空的公共的构造方法,也和获得带参数的公共的构造方法)。

getDeclaredConstructor(Class<?>…parameterTypes)返回指定构造方法 Constructor 对象。(只要是声明过的构造方法都可以获取到,包括私有的方法。因为父类的构造方法子类是不可以继承的,所以不牵扯父类的因素)
      如果要使用的构造方法不是公共的,需要调用class对象的getDeclareConstructor()方法,获取指定的构造方法。在获取之后使用之前需要暴力破解,调用该方法对象的setAccessiable()方法,参数设置为true,打破权限限制才可进行操作。

常用的方法

isAnonymousClass()当是匿名内部类时返回 true。
isLocalClass()当是方法内部类或者说局部内部类时返回 true。
isMemberClass()当是成员内部类时返回 true。
isPrimitive()判定指定的Class对象是否表示一个基本类型。
getName()以String的形式返回此Class对象所表示的类的全路径名。
getSimpleName()返回源代码中给出的底层类的简称也就是类名。

getMethod(String name, Class<?>…parameterTypes) 返回一个指定公共成员方法的Method对象。
getDeclaredMethod(String name, Class<?>…parameterTypes)返回指定已声明方法Method 对象。(只要声明了就可以获取到包括私有的方法,但是不包括从父类继承到的方法)
getMethods() 返回一个包含公共方法 Method 对象的数组(只要是它有的就可以得到。包括父类中公共的方法)。
      如果要使用的方法不是公共的。在获取到方法之后使用之前需要暴力破解,调用该方法对象的setAccessiable()方法,参数设置为true,打破权限限制才可进行操作。

getField(String name)返回一个指定公共成员属性的Field对象。
getDeclaredField(String name) 返回一个指定已声明属性的 Field 对象。
getDeclaredFields()返回所声明的所有属性Field 对象的一个数组。

Method类

getExceptionTypes()返回Class对象(代表此Method对象表示的底层方法抛出的异常类型)的数组,
getName() 以 String 形式返回此 Method 对象表示的方法名称。
getParameterTypes() 按声明顺序返回Class对象参数类型的数组。
getReturnType()返回一个代表此Method对象所表示的方法的返回类型类型。
isVarArgs() 测试方法是否带有可变数量的参数。

// 第一个参数表示方法要作用的对象
// 第二个参数表示这个方法执行所需要的参数
invoke(Object obj, Object…args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

Field类

get(Object obj)返回指定对象上此 Field 表示的属性的值。
getType() 返回一个Class对象,标识了此Field对象属性的声明类型。
set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的属性设置为指定的新值。
setInt(Object obj,int i)将字段的值设置为指定对象上的一个int值。(byte、short、long、float、double、char都可以)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值