java反射(基本知识)

在java中反射降低了模块间的依赖性这个过程称解耦---高内聚,低耦合

 

在java中,万物皆对象,则将字节码看成一个对象,将一个方法看成一个对象.....

反射--剖析类,分析类的字节码,产生对象的字节码对象以及实例对象

  Class---代表字节码的类---代表类的类

  Field---代表属性的类

  Method---代表方法的类

  Constructor---代表构造方法的类

  Package--代表包的类

如何获取一个类的对象:(三种方式)

  1. 通过对象的getClass()方法来获取这个对象所对应的类的字节码对象;

  2. 通过类名.class 的方式来获取代表这个类的字节码对象;

  3. 通过Class.forName()方法来获取这个字符串所代表的类的字节码对象;(用的比较多)

    Class<Person> c = Class<Person>Class.forName(Reflect.Students.”);

重要方法

  forName(String className)---返回的是一个Class<?>;获得的是一个字节码对象(类的对象)

  newInstance()---创建字节码对象所对应的实例对象(必须是无参构造时)

  getConstructor(Class ... paramterTypes)---获取指定的构造函数,该构造函数必须是public,

  getDeclaredMethod:--获取指定构造函数。是全部的构造函数(包括默认的和私有的),但是只能是本类的。

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.Method;
 6 import java.text.SimpleDateFormat;
 7 import java.util.Properties;
 8 
 9 import java.util.Date;
10 
11 public class ProfessionDemo {
12     public static void main(String[] args) throws Exception {
13         File file = new File("D:\Workspaces\SGB1704\bin\Reflect\config.properties");
14         Properties pro = new Properties();
15         pro.load(new FileInputStream(file));
16 
17         String classname = pro.getProperty("classname");
18         String[] attrname = pro.getProperty("attrname").split("/");
19         String[] attrvalue = pro.getProperty("attrvalue").split("/");
20         String methodname = pro.getProperty("methodname");
21 
22         // 获取字节码对象
23         Class<Profession> pf = (Class<Profession>) Class.forName(classname);
24         // 参数类型
25         Class[] parameterList = { String.class, int.class, Date.class,char.class };
26         // 列举参数
27         Object[] objargs = new Object[] { 
28                 attrvalue[0],
29                 Integer.parseInt(attrvalue[1]),
30                 new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[2]),
31                 attrvalue[3].charAt(0) 
32         };
33         // 获取构造函数
34         Constructor<Profession> prop = pf.getDeclaredConstructor(parameterList);
35         // 实例化对象(有参构造)
36         Profession p = prop.newInstance(objargs);
37         // 遍历属性名
38         for (int i = 0; i < attrname.length; i++) {
39             // 每个参数名
40             String attrnameStr = attrname[i];
41             // 根据属性名来获取这个属性对象
42             Field f = pf.getDeclaredField(attrnameStr);
43             Class fpf = f.getType();
44             // 拼接出set方法
45             String setMethodName = "set"
46                     + attrnameStr.substring(0, 1).toUpperCase()
47                     + attrnameStr.substring(1);
48             // 获取指定方法
49             Method setMothod = pf.getMethod(setMethodName, fpf);
50             // 判断类型执行不同的方法
51             if (fpf == int.class || fpf.equals(Integer.class)) {
52                 setMothod.invoke(p, Integer.parseInt(attrvalue[i]));
53             } else if (fpf.equals(Date.class)) {
54                 setMothod.invoke(p,
55                         new SimpleDateFormat("yyyy-MM-dd").parse(attrvalue[i]));
56             } else if (fpf == char.class || fpf.equals(Character.class)) {
57                 setMothod.invoke(p, attrvalue[i].charAt(0));
58             } else {
59                 setMothod.invoke(p, attrvalue[i]);
60             }
61 
62             // 获取指定的方法
63             Method m = pf.getDeclaredMethod(pro.getProperty("methodname"), null);
64 
65             // 执行指定的方法
66             m.invoke(p, null);
67 
68         }
69 
70     }
71 
72 }
原文地址:https://www.cnblogs.com/tongxuping/p/6832492.html