Java语言的反射机制
1. Java反射的含义:获取应用中正在运行的Java对象。
2. Java反射机制: 在运行的程序中,对于任意的类,都可以知道这个类的属性、方法以及构造函数,对于任意对象都可以调用它的方法。这种在运行时动态获取和修改类的信息的能力称为Java反射机制。
3. Java反射的功能:
1) 在运行时判断任意一个对象所属的类
2) 在运行时创建任意一个类的对象
3) 在运行时获取任意一个类的所有成员变量、方法以及构造函数
4) 在运行时调用任意一个对象的方法
5) 作为动态代理的基础,生成代理类
4. Java反射的实现类
1) Class : Class类表示Java应用运行时的类或接口
2) Field : 提供有关类或接口的属性信息的对象
3) Method : 提供有关类或接口方法信息的对象
4) Constructor : 提供有关类构造函数的信息
注意:Class类是Java反射中最重要的一个功能类,所有获取对象的信息(包括:方法/ 属性/构造方法/访问权限)都需要它来实现。
5. 编写Java反射程序的步骤:
1) 首先获取一个类或对象的Class对象,方法如下:
Class clazz1 = ClassName.class;
Class clazz2 = Class.forName("com.znker.reflection.ClassName");
Class clazz3 = Object.getClass();
2) 调用Class对象中的方法来获取一个类的的属性、方法以及构造函数的对象
6. Java反射的使用案例
1) 获取一个对象的包名和类名
package com.znker.reflection; public class ReflectionDemo { // other codes } /** * Java 反射案例:获取一个对象的完整包名和类名 * */ public class ReflectionTest { public static void main(String[] args) { ReflectionDemo demo = new ReflectionDemo(); System.out.println(demo.getClass().getName()); } }
2) 实例化Class对象
package com.znker.reflection; /** * 三种实例化Class对象的方式 * * */ public class ReflectionTest { @SuppressWarnings({ "unused", "rawtypes" }) public static void main(String[] args) { // 最常用的形式 try { // @param 类的全路径名 Class<?> clazz1 = Class.forName("com.znker.reflection.Reflection"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Class clazz2 = ReflectionDemo.class; Class clazz3 = new ReflectionDemo().getClass(); } }
3) 利用无参构造函数创建对象
package com.znker.reflection; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "[" + this.name + " , " + this.age + "]"; } } package com.znker.reflection; public class Refdemo { public static void main(String[] args) { Class<?> demo = null; try { demo = Class.forName("com.znker.reflection.Person"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Person person = null; try { // 通过无参构造函数实例化对象, 构造一个与Class有关的对象 person = (Person) demo.newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } person.setName("John"); person.setAge(18); System.out.println(person); } }