欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java分享笔记:关于Java反射机制

程序员文章站 2022-05-18 23:25:47
关于Java反射机制:Class实例获取的方法,通过反射创建运行时类对象并调用其属性和方法。 ......

[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 }

 

注:希望与各位读者相互交流,共同学习进步。