简单上代码了解一下:

1.实体类

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

 

 1 package com.reflection;
 2 
 3 public class Student {
 4     //学生实体类,包含编号,名字,所属班级的属性
 5     private int id;
 6     private String name;
 7     private String cname;
 8 
 9     public Student() {
10         super();
11     }
12     //构造器
13     public Student(int id, String name, String cname) {
14         super();
15         this.id = id;
16         this.name = name;
17         this.cname = cname;
18     }
19 
20     public int getId() {
21         return id;
22     }
23     public void setId(int id) {
24         this.id = id;
25     }
26 
27     public String getName() {
28         return name;
29     }
30     public void setName(String name) {
31         this.name = name;
32     }
33     
34     public String getCname() {
35         return cname;
36     }
37     public void setCname(String cname) {
38         this.cname = cname;
39     }
40     
41 }

 

2.反射方法示例:

 1 package com.reflection;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.InvocationTargetException;
 6 import java.lang.reflect.Method;
 7 import java.util.ArrayList;
 8 import java.util.List;
 9 
10 /*
11  * Java动态性之反射机制:reflection
12  * 动态语言:
13  * 程序运行时,可以改变程序结构或变量类型,Java并非动态语言,但其拥有动态性,利用反射机制以及字节码操作获得类似动态语言的特性.
14  * 一.反射机制:可以于运行时加载,探知,使用编译期间完全未知的类。 
15  *  (1)PS:程序在运行状态中,可以动态的加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性
16  *  (2)操作方式:Class c=Class.forName("com.reflection.Reflect");
17  *  (3)反射:加载完类之后,在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象),该对象包含了完整的类的结构信息,通过这个对象可以看到类的结构,这便是反射。
18  *  (4)Class类是Reflection的根源:针对任何想要动态加载,运行的类,唯有先获得相应的Class对象。
19  *  (5)获取Class对象的三种方式: getClass(),Class.forName(),.class语法
20  *  (6)反射机制的常见作用:
21  *  动态加载类,动态获取类的信息(属性,方法,构造器)/动态构造对象/动态调用类和对象的任意方法及构造器/
22  *  动态调用和处理属性/获取泛型信息/处理注解
23  * 二.动态编译:
24  * 
25  * 三.动态执行JavaScript代码:
26  * 
27  * 四.动态字节码操作:
28  * 
29  * 
30  * 
31  */
32 public class Reflect {
33 
34     @SuppressWarnings("all")
35     public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
36         try {
37 
38             //获取Student类的Class对象
39             Class c=Class.forName("com.reflection.Student");
40             //通过该Class对象获取该类的具体名字(包含包名)及类名
41             String realName=c.getName();
42             String name=c.getSimpleName();
43             System.out.println(" 具体名字:"+realName+" 类名:"+name);
44 
45             //获取类的属性
46             //Field[] field=c.getFields();//只能获取public的属性
47             Field[] fields=c.getDeclaredFields();
48             //获取所有属性
49             for(Field f:fields) {
50                 System.out.println("属性:"+f);
51             }
52 
53             /*获取类所有的方法
54             PS:如果方法有参,则必须参数类型对应的Class对象
55             Method m1=c.getDeclaredMethod("getName", null);
56             Method m2=c.getDeclaredMethod("setName", String.class);*/
57             Method[] methods=c.getMethods();
58             for(Method m:methods) {
59                 System.out.println("方法:"+m);
60             }
61 
62             //获取类所有的构造器
63             Constructor[] constructors=    c.getConstructors();
64             for(Constructor con:constructors) {
65                 System.out.println("构造器:"+con);
66             }
67 
68             //通过反射调用构造方法,构造对象,创建记录并将其放入集合中,然后打印出来
69             Constructor<Student> cr=c.getConstructor(int.class,String.class,String.class);
70             Student s1=cr.newInstance(123,"张三","软件一班");
71             Student s2=cr.newInstance(456,"李四","软件二班");
72             List<Student> list=new ArrayList<Student>();
73             list.add(s1);
74             list.add(s2);
75             System.out.println("编号:"+list.get(0).getId()+" 姓名:"+list.get(0).getName()+" 班级:"+list.get(0).getCname());
76             System.out.println("编号:"+list.get(1).getId()+" 姓名:"+list.get(1).getName()+" 班级:"+list.get(1).getCname());
77 
78 
79             //接下来直接利用对象里面的方法来对 Student实体类进行初始化数据操作
80             Class c2=Class.forName("com.reflection.Student");
81             Student s3=(Student)c2.newInstance();
82             //先获取Class对象里面的方法
83             Method m2=c2.getDeclaredMethod("setName", String.class);
84             //使用该方法
85             m2.invoke(s3, "王五");
86             System.out.println("方法实现后获取值为:"+s3.getName());
87 
88         } catch (ClassNotFoundException e) {
89 
90             e.printStackTrace();
91         }
92 
93     }
94 
95 }

 

效果截图:

java-初识反射Reflection 随笔 第1张

java-初识反射Reflection 随笔 第2张

ps:文章待完善,如存在不正之处欢迎大佬指出。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄