Java反射的深入浅出,java面试突击第三季笔记

以上类都位于java.lang中

2.2 获取Class对象的方法


了解了什么是反射后,是不是也想体验一下反射这种骚操作?

想秀操作,首先要获取Class对象吧,因为Class对象是代表着各种类,有了它之后才可以得到类的各种信息。获取方法如下:

1)通过object.getClass()

public static void main(String[] args) {

Car car = new Car();

Class clazz = car.getClass();

}

注意:此方法不适用于int、float等类型

2)通过(类型名).class、包装类.Type

public static void main(String[] args) {

Class clazz = Car.class;

Class cls1 = int.class;

Class cls2 = String.class;

Class cls3=Iteger.Type

}

3)通过Class.forClass(String 类的全限定名)

1 try {

2 Class clz = Class.forName(“com.frank.test.Car”);

3 } catch (ClassNotFoundException e) {

4 e.printStackTrace();

5 }

采 用哪种方法来获取,看实际情况而定。

2.3获取类信息


有了Class对象后,就可以获取类的成员(方法+属性)、注解和类的修饰符等。上面也说了,java中方法用Method类表示、属性用Field类表示、注解用Annotation类来表示、修饰符用Modifier类表示。Class类中有对应的方法来获取他们。如下:

2.3.1 获取属性Field的对象

1 //获取所有的属性,但不包括从父类继承下来的属性

2 public Field[] getDeclaredFields() throws SecurityException

3 //获取自身的所有的 public 属性,包括从父类继承下来的。

4 public Field[] getFields() throws SecurityException

5 //获取在本类中声明的指定的属性,参数为属性的名称

6 public Field getDeclaredField(String name)

7 //获取指定的公有属性,包括父类的,参数为属性的名称

8 public Field getField(String name)

2.3.2 获取方法Method对象

//获取本类声明指定的的方法,第一个参数是方法的名称,后面的参数是方法参数类型的类,

//如获取setName(String name)方法,getDeclareMethod(“setName”,String.Class)

public Method getDeclaredMethod(String name, Class<?>… parameterTypes)

//获取公有的方法,包括父类的

public Method getMethod(String name, Class<?>… parameterTypes)

//获取本类中声明的所有方法

public Method[] getDeclaredMethods()

//获取所有的公有方法,包括父类的

public Method[] getMethods()

2.3.3 获取构造器Constructor对象

//获取本类中指定的构造方法

public Constructor getDeclaredConstructor(Class<?>… parameterTypes)

//获取指定的公有构造方法

public Constructor getConstructor(Class<?>… parameterTypes)

//获取本类中所有的构造方法

public Constructor<?>[] getDeclaredConstructors() throws SecurityException

//获取本类中所有的公有构造方法

public Constructor<?>[] getConstructors()

构造方法的获取与普通方法的获取大致是一样的。

------------------------------------------------------------------

以上的方法都是在Class类中,别傻傻不知道(别问我怎么知道的>_>),然后通过Class对象调用就可以了。

这里只是列举了常用类信息的的获取方法,其他信息的获取方法,看API文档吧,如注解、类的Class的对象(额好像有点绕。。。)等.

2.4 获取类成员信息


上面只是获取了类的成员所代表类的对象,我们还要使用他们或者获取成员的信息(名称、修饰符等)。因为有了代表成员的对象,使用对象调用实例方法就可以了。

2.4.1 Field类

Field类的方法大概可以分为两种,一种是获取属性的信息,另外一种是设置属性的值。

第一种:

1 //返回由此 Field对象表示的字段的名称

2 String getName()

3 //返回一个 类对象标识了此表示的字段的声明类型 Field对象。

4 Class<?> getType()

5 //返回由该 Field对象表示的字段的Java语言修饰符,作为整数。把整数作为Modifier的构造方法的参数,就可以获取该整数代表的修饰符类的对象了

6 int getModifiers()

7 ----------------------------------------------------------------

8

9 //获取类型为 int的静态或实例字段的值,或通过扩展转换转换为类型 int的另一个原始类型的值。

10 int getInt(Object obj)

11 //获取类型为 long的静态或实例字段的值,或通过扩大转换获得可转换为类型 long的另一个基本类型的值。

12 long getLong(Object obj)

13 …此处省略一堆get**(Object obj)的方法,属性是什么基本类型,就get什么就行了

14属性是引用类型,那么就调用以下方法

15 //返回该所表示的字段的 Field ,指定的对象上。 16 Object get(Object obj)

第二种:

1 //设置作为一个字段的值 double指定的对象上。

2 void setDouble(Object obj, double d)

3 //设置作为一个字段的值 float指定的对象上。

4 void setFloat(Object obj, float f)

5 //设置作为一个字段的值 int指定的对象上。

6 void setInt(Object obj, int i)

7 …此处省略一堆set**()方法,属性是什么基本类型就set什么就行了

8 属性是引用类型,那么就调用以下方法

9 //将指定对象参数上的此 Field对象表示的字段设置为指定的新值。

10 void set(Object obj, Object value)

注意啦:如果没有访问权限的话,默认是不能设置属性值的,那怎么办呢?是不是就秀不了操作了?然而,前面也说了,反射很牛逼,可以来一些非常规操作,

这时我们调用Class对象的setAccessible(true)方法就可以了!

是不是觉得反射可以很强?

2.4.1 Method类

Method类的方法主要是获取方法的信息

部分方法:

1 int getModifiers() //返回由该对象表示的可执行文件的Java语言modifiers 。

2 String getName() //返回由此 方法对象表示的方法的名称,作为 String 。

3 Annotation[][] getParameterAnnotations() //返回一个 Annotation s的数组数组,表示由该对象表示的Executable的形式参数的声明顺序的 Executable 。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

image

image

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

领取!(备注Java)**
[外链图片转存中…(img-4bw08Scw-1710969983853)]

最后

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

[外链图片转存中…(img-pfVWSAFq-1710969983853)]

[外链图片转存中…(img-fQHfTrqT-1710969983854)]

其实面试这一块早在第一个说的25大面试专题就全都有的。以上提及的这些全部的面试+学习的各种笔记资料,我这差不多来回搞了三个多月,收集整理真的很不容易,其中还有很多自己的一些知识总结。正是因为很麻烦,所以对以上这些学习复习资料感兴趣,

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值