反射-----框架设计的灵魂
反射:将类的各个组成部分封装为其他对象。
三阶段:源代码阶段、class类对象阶段、运行时阶段
好处:在程序运行中操作类对象
可以解耦,提高扩展性
获取Class对象的方法:
1.Class.forName("全类名"),将字节码文件加载进内存,返回Class对象
多用于配置文件,将类名定义在配置文件中。读取文件,加载类
2.类名.class:通过类名的属性class获取字节码文件方式
多用于参数传递
3.对象.getclass
多用于对象获取
同一个.class 文件在一次程序运行中只被加载一次。
class对象功能
获取功能:
1.获取成员变量们
*Field[] getFields():获取所有public成员变量
field a=personclass.getfield(nam:"a")
person p =new person();
object value = a.get(p);
a.set(p,"张三")
*Field[] getFields(String name)
*Field[] getDeclaredFields()
不考虑修饰符
b.setAccessible(true)//暴力反射
*Field[] gettDeclaredFields(String name)
2. 获取构造方法们
constructor[] getconstructors()
3.获取成员方法们
method[] getmethods
4.获取类名
package reflect; import java.io.InputStream; import java.lang.reflect.Method; import java.util.Properties; public class treflectest { public static void main(String[] args) throws Exception{ //可以创建对象,执行方法 //1.加载配置文件 //1.1创建properties Properties pro =new Properties(); //1.2加载配置文件 获取路劲 ClassLoader classLoader =treflectest.class.getClassLoader(); InputStream is=ClassLoader.getSystemResourceAsStream("pro.properties"); pro.load(is); //2.获取文件中的数据 String className = pro.getProperty("className"); String methodName = pro.getProperty("methodName"); //3.加载类进内存 Class cls=Class.forName(className); //4.创建对象 Object obj= cls.newInstance(); //5.获取对象 Method method =cls.getMethod(methodName ); //6.执行 method.invoke(obj); } }