[java]反射机制(Reflection)几种获取方法详解(上)

来讲一讲反射机制中以下几种获得方法:

  1. 获取Class对象
  2. 获取属性
  3. 获取方法
  4. 获取构造器
  5. 注解信息的获取

其中我主要想讲的是这么多方法中Declared有无的区别,以及获取方法的方法中比较眼生的parameterTypes形参.

这里先给答案,带Declared的获取方法返回本类而不返回父类的属性/方法对象.

在开始之前先简单的介绍一下反射机制
java不是动态语言,但是通过反射机制使得java具有了动态性.
所谓的反射机制就是指一个类被加载后,JVM 会创建一个对应类的Class 对象,类的整个结构信息会被放到Class 对象中,而通过这个Class对象我们可以获得类的全部信息,并对其进行动态访问以及更改.

1 获取Class对象

主要有三种方式 都比较简单:

  • 通过字节码文件获取(比如int.class)
  • 对已创建的对象调用 getClass()方法
  • 调用Class类中的静态方法 forName(String className)

第一种通过字节码文件获取Class对象是最简单的方式,但是正因为简单所以指向不明,一般用于当前包中的类 基本数据类型 以及void.

为了知道一个数据的类型,大家之前可能都用过getClass(),这个方法实际上就返回了一个Class对象.

第三种forName方法是最稳健的做法,className不光是类的名字而是一个包含完整包名的字符串,比如"cn.sxt.反射.User" 就像是导入类的写法.

2 获取属性

Class类提供了四个获取属性的方法:

  • getDeclaredField(String name)
  • getDeclaredFields()
  • getField(String name)
  • getFields()

getDeclaredField(String name)和 getField(String name) 方法返回的是一个Filed对象,需要提供指定属性的名称字符串.
而getDeclaredFields() 和getFields() 返回的是所有属性的集合Filed对象数组 Filed[]
Declared中文意思是声明 .
有无Declared的区别在于:
没有Declared的两个方法(getField(String name) 和getFields() )返回父类以及本类中public修饰的属性Filed对象
而带着Declared的两个方法(getDeclaredField(String name) 和getDeclaredFields() )返回本类中的所有属性而不返回父类中的属性

3 获取方法

与获取属性类似,Class提供了4种获取方法 返回的是Method对象或Method[]数组对象

  • getDeclaredMethod(String name, Class<?>… parameterTypes)
  • getDeclaredMethods()
  • getMethod(String name, Class<?>… parameterTypes)
  • getMethods()

getDeclaredMethods() 和getMethods() 返回Method[]数组对象
getDeclaredMethod(String name, Class<?>... parameterTypes) 和getMethod(String name, Class<?>… parameterTypes) 返回指定方法名的Method对象

有无Declared的区别与上述类似:
没有Declared的两个方法(getMethods()和getMethod() )返回父类以及本类中public修饰的方法Method对象.
而带着Declared的两个方法(getDeclaredMethod() 和getDeclaredMethods() )返回本类中所有方法的Method对象而不返回父类中的方法 .

值得注意的是getDeclaredMethod() 和getDeclaredMethods()这次不是返回所有方法,而是指返回公共方法.

方法可以同名重载,所以获取方法中另外Class<?>… parameterTypes就是指定一个或多个形参类型的Class对象,举三个例子:
1 一个类中有public void fun()方法,这个类的Class对象为class,为了获取这个fun的Method对象可以调用获取方法:
Method m1=class.getMethod(“fun”);

Method m1=class.getMethod(“fun”,null);

2 一个类中有public void fun(int num)方法,这个类的Class对象为class,为了获取这个fun的Method对象可以调用获取方法:
Method m2=class.getMethod(“fun”,int.class);

3 一个类中有public void fun(int num1,int num2,String name)方法,这个类的Class对象为class,为了获取这个fun的Method对象可以调用获取方法:
Method m3=class.getMethod(“fun”,int.class,int.class,String.class);

使用: method对象.invoke(调用方法的对象,参数…)
值得注意的是通过反射调用静态方法时第一个参数-"调用方法的对象"既可以是类对象也可以是null.

4 获取构造器

同样是四种方法:

  1. getDeclaredConstructor(Class<?>… parameterTypes)
  2. getDeclaredConstructors()
  3. getConstructor(Class<?>… parameterTypes)
  4. getConstructors()

获取构造器的方法返回的都是本类的构造器.
这里有无Declared的区别在于:
有Declared的方法获得的是本类的所有构造器对象数组(包括private).
没有Declared的方法获得的是本类中public修饰的构造器对象数组.

形参Class<?>… parameterTypes与方法获取的使用方式相同.

获取注解信息的内容下期再见! 请点个赞吧亲

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值