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

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

 

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

posted @ 2018-08-08 10:16  Killer-V  阅读(332)  评论(0编辑  收藏  举报