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