努力到达

'Tequila

Life is too short to be ordinary.

Java基础总结(三)

Java反射

 

反射概述

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。简单来说,就是反射可以帮助我们在动态运行的时候,对于任意一个类,可以获得其所有方法,所有的变量(是所有的!包括私有!)

 

反射的作用

  • 获取某些类的一些变量,调用某些类的私有方法。
  • 增加代码灵活性(很多主流框架都使用了反射技术,像ssm框架都采用两种技术xml做配置文件+反射技术)

 

反射的常用对象:

Class

Class类的实例表示正在运行的Java应用程序中的类和接口

 

Constructor

关于类的单个构造方法的信息以及对它的访问权限

 

Field

Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限

 

Method

Method提供关于类或接口上单独某个方法的信息

 

不管我们想要获得构造方法、属性还是方法,前提都是我们要先获得Class对象 

Class

如何得到某个class文件对应的Class对象

  • 已知类和对象的情况下
    •   类名.class
    •   对象.getClass()——Object类提供

 

  • 未知类和对象的情况下
    •   Class.forName(“包名.类名”)
    •        推荐使用第三种方法,因为我们通常做反射的时候,都是在不知道类的实例的时候进行操作的。要注意,在使用第三种方法Class.forName();来获得Class对象的时候,会抛出一个ClassNotFoundException(没有发现类异常),要处理异常。

 

Constructor类

Constructor类的实例对象代表类的一个构造方法

 

得到某个类所有的构造方法

Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();

 

 

得到指定的构造方法并调用

Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors(String.class);

String str = (String)constructor.newInstance(“abc”)

 

 

Class类的newInstance()方法用来调用类的默认构造方法

String obj = (String)Class.forName(“java.lang.String”).newInstance();

 

 

Field类

Field类代表某个类中的一个成员变量,并提供动态的访问权限

 

Field对象的获得

 

Field[] fields = c.getFields();//取得所有的public属性(包括父类继承)

  Field[] fields = c.getDeclaredFields();//取得所有声明的属性

 

得到指定的成员变量

Field name = c.getField(“name”);

Field name = c.getDeclaredField(“name”);

 

设置Filed变量是否可以访问

field.setAccessible(boolean);

 

-Field变量值的读取,设置

field.get(obj);

filed.set(obj,value)

 

 

Method类

Method类代表某个类中的一个成员方法

 

Method对象的获得

  获得所有方法

  • getDeclaredMethods();
  • getMethods();

  获得指定的方法

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

       通过反射执行方法

  • invoke(Object obj,Object…args);
posted @ 2021-04-09 10:26  'Logan  阅读(51)  评论(0)    收藏  举报