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);

浙公网安备 33010602011771号