Java开发热门前沿知识!Java反射的深入浅出

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<T> getDeclaredConstructor(Class<?>... parameterTypes)

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

public Constructor<T> 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 。  

4 int getParameterCount() //返回由此对象表示的可执行文件的形式参数(无论是显式声明还是隐式声明)的数量。  

5 Class<?>[] getParameterTypes() //返回一个 类对象的数组, 类以声明顺序表示由该对象表示的可执行文件的形式参数类型。 

```



### 2.4.1 Constructor类



Constructor类的方法主要是获取构方法的信息和创建对象



**获取方法信息:**



```

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

2 String getName() //以字符串形式返回此构造函数的名称。  

3 Annotation[][] getParameterAnnotations() //返回的数组的数组 Annotation表示的形参进行注释s时,声明顺序的的 Executable该对象表示。  

4 int getParameterCount() //返回由此对象表示的可执行文件的形式参数(无论是显式声明还是隐式声明)的数量。  

5 Class<?>[] getParameterTypes() //返回一个 类对象的数组, 类以声明顺序表示由该对象表示的可执行文件的形式参数类型。 

```



创建对象的方法先不说,放到后面去。



2.5 反射创建对象和调用方法

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



### 2.5.1 创建普通类的对象



创建普通类的对象可以分为两种方法



**第一种:调用Class对象的方法**



```

4 //首先获取Class对象

5 Class clazz=Class.forClass("test.Student");

6 //创建对象

7 Student stu=(Student)clazz.newInstance();

注:此方法只能创建无参构造函数的类的对象




**第二种:通过Constructor的newInstance()方法**



1 //首先创建Class对象

2 Class clazz=Class.forClass(“test.Student”);

3 //获取想调用的构造函数

4 Constructor constructor=clazz.getConstructor(String.class, int.class);

5 //调用Constructor的newInstance()方法

6 Student stu=(Student)constructor.newInstance(“大王”,20);




### 2.5.2 创建数组



数组本质上是一个 Class,而在 Class 中存在一个方法用来识别它是否为一个数组。



反射创建数组是通过 Array.newInstance(T.class,维数) 这个方法。



# 总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!如果你需要这份完整版的**面试真题笔记**,只需你多多**支持**我这篇文章。

**[资料领取方式:戳这里免费下载](https://gitee.com/vip204888/java-p7)**

5.2 创建数组



数组本质上是一个 Class,而在 Class 中存在一个方法用来识别它是否为一个数组。



反射创建数组是通过 Array.newInstance(T.class,维数) 这个方法。



# 总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!如果你需要这份完整版的**面试真题笔记**,只需你多多**支持**我这篇文章。

**[资料领取方式:戳这里免费下载](https://gitee.com/vip204888/java-p7)**

![](https://img-blog.csdnimg.cn/img_convert/88f9e118b966487139ca61fa52469025.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值