[1] 关于Java反射机制的概述
1.反射机制的概念:允许程序在执行期,借助于反射相关的API,取得任何类的内部信息,并能直接操作任意对象内部的属性和方法。
2.与反射相关的主要的API:java.lang.Class(代表一个类),java.lang.reflect.Field(代表一个属性),java.lang.reflect.Method(代表一个方法),java.lang.reflect.Constructor(代表类的构造器)。
3.关于类的Class实例的说明:创建一个类(.java文件),通过编译(javac.exe)生成对应的字节码文件(.class)。之后使用java.exe进行加载(类加载器)。将字节码文件加载进内存以后,就是所谓的运行时类,被存在缓存区。那么这个运行时类本身就是系统创建的Class的实例,这就是反射的源头。程序员可以对某个类的Class实例进行获取。
以下是与反射相关的程序演示,分为Person.java,TestClass.java两个文件
[2] Person.java文件
1 package pack01; 2 3 public class Person { 4 5 public String name; 6 private int age; 7 8 //构造方法 9 public Person() { 10 11 } 12 public Person(String name, int age) { 13 this.name = name; 14 this.age = age; 15 } 16 17 //操作name 18 public void setName(String name) { 19 this.name = name; 20 } 21 public String getName() { 22 return name; 23 } 24 25 //操作age 26 public void setAge(int age) { 27 this.age = age; 28 } 29 public int getAge() { 30 return age; 31 } 32 33 //重写toString方法 34 public String toString() { 35 return "name=" + name + " , age=" + age; 36 } 37 38 //其他方法 39 public void displayInfo(String s) { 40 System.out.println("info: " + s); 41 } 42 }
[3] TestClass.java文件
1 package pack01; 2 3 import org.junit.Test; 4 import java.lang.reflect.*; 5 6 public class TestClass { 7 8 //*******************获取运行时类的Class实例,常见的4种方法******************** 9 @Test 10 @SuppressWarnings("rawtypes") //取消泛型警告 11 public void testMethod1() throws ClassNotFoundException { 12 13 //1.通过运行时类的class属性获取 14 Class classOfPerson1 = Person.class; 15 System.out.println( classOfPerson1 ); 16 17 //2.通过运行时类的对象获取,调用getClass()方法 18 Person p1 = new Person(); 19 Class classOfPerson2 = p1.getClass(); 20 System.out.println( classOfPerson2 ); 21 22 //3.通过Class的静态方法forName()获取 23 Class classOfPerson3 = Class.forName("pack01.Person"); 24 System.out.println( classOfPerson3 ); 25 26 //4.通过类的加载器ClassLoader获取 27 ClassLoader cl = this.getClass().getClassLoader(); 28 Class classOfPerson4 = cl.loadClass("pack01.Person"); 29 System.out.println( classOfPerson4 ); 30 31 } 32 33 //*****************通过反射创建运行时类的对象,并调用运行时类的属性和方法**************** 34 @Test 35 public void testMethod2() throws Exception { 36 37 //1.使用类的class属性,获取运行时类Person类的Class实例 38 Class<Person> classOfPerson = Person.class; 39 40 //2.使用反射创建Person类的一个对象 41 Person p1 = classOfPerson.newInstance(); 42 43 //3.使用反射获取Person类中的公有属性,并修改p1中的该属性 44 Field f1 = classOfPerson.getField("name"); 45 f1.set(p1, "ZhangSan"); 46 47 //4.使用反射获取Person类中的私有属性,并修改p1中的该属性 48 Field f2 = classOfPerson.getDeclaredField("age"); 49 f2.setAccessible(true); 50 f2.set(p1, 20); 51 52 //5.使用反射获取Person类的无参方法,并令p1执行该方法 53 Method m1 = classOfPerson.getMethod("toString"); 54 String str = (String) m1.invoke(p1); 55 System.out.println(str); 56 57 //6.使用反射获取Person类的有参方法,并令p1执行该方法 58 Method m2 = classOfPerson.getMethod("displayInfo", String.class); 59 m2.invoke(p1, "I am from China."); 60 61 } 62 }
注:希望与各位读者相互交流,共同学习进步。