反射:框架设计的灵魂web
框架:半成品软件。能够在框架的基础上进行软件开发,简化代码框架
反射:将类的各个组成部分封装为其余对象,这就是反射机制(在Class类中包装)设计
好处:一、能够在程序运行过程当中,操做这些对象对象
二、能够解耦,提升程序的可扩展性内存
获取Class对象的方式:开发
一、Class.forName("全类名"):将字节码文件加载进内存,返回class对象,全类名就是包名加上类名get
多用于配置文件,将类名定义在配置文件中,读取文件,加载类servlet
二、类名.class:经过类名的属性class获取io
多用于参数的传递class
三、对象.getClass():getClass()方法在Object类中定义
多用于对象的获取字节码的方式
注意:同一个字节码文件(*.class)在一次程序运行过程当中,只会被加载一次,不论经过哪种方式获取的class对象都是同一个。
示例代码:
public class Demo { public static void main(String[] args) throws Exception{ Class cls1 = Class.forName("lianbang.wu.web.servlet.Person"); System.out.println(cls1); Class cls2 = Person.class; System.out.println(cls2); Person p1 = new Person(); Class cls3 = p1.getClass(); System.out.println(cls3); } }
使用Class对象功能:
获取功能:一、获取成员变量
二、获取构造方法
三、获取成员方法
四、获取类名
示例代码:
public class Demo { public static void main(String[] args) throws Exception{ Class personClass=Person.class; Field[] fields = personClass.getFields(); Field field = personClass.getField("level"); Person p =new Person("读者",18,2); Object value = field.get(p); System.out.println(value); field.set(p,3); System.out.println(p.level); Field field1 =personClass.getDeclaredField("age"); field1.setAccessible(true); Object value1 =field1.get(p); System.out.println(value1); System.out.println(p.getAge()); Constructor constructor =personClass.getConstructor(String.class,int.class,int.class); Object p1 =constructor.newInstance("新读者",19,3); Object p2 =personClass.newInstance(); Method method = personClass.getMethod("eat", String.class); method.invoke(p,"饭"); System.out.println(method.getName()); System.out.println(personClass.getName()); } }