1. 概述:
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
(1),好处:
1,可以在程序运行过程中,操作这些对象
2,解耦,提高程序的可拓展性
(2),Java代码 在计算机中经历的阶段:三个阶段
源文件代码阶段->类加载器()->Runtime运行时代码
类加载器用于将字节码文件加载进内存
2. 获取字节码Class对象的三种方法(分别对应Java代码的三个阶段)
1,Class.forname("全类名");将字节码文件加载进内存,返回Class
多用于配置文件,将类名定义在配置文件中,读取文件,加载类
2,类名.class:通过类名的属性class获取
多用于参数的传递
3,对象.getClass();getClass()方法在object类中定义
多用于获取对象的字节码文件
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种凡是获取的Class对象都是同一个
3. Class对象功能
获取功能
(1),获取成员变量
Field[] getFields():获取所有public修饰的成员变量
Field getField(String name):获取指定名称public修饰的成员变量
Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name:获取指定名的成员变量。
使用private修饰的成员便改良时需要忽略访问权限修饰符的安全检查
Field对象.setAcceccible(true);即暴力反射
(2),获取构造方法
Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor<?>[] getConstructors()
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
(3),获取成员方法
Method getMethod(String name, Class<?>... parameterTypes)
Method[] getMethods()
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method[] getDeclaredMethods()
(4),获取类名
String getName()
(5),Fild:成员变量
操作:
1,设置值
*Void set(Object obj,Object value)
2,获取值
* Get(Object obj)
3,忽略访问权限修饰符的安全检查
*Field对象.setAcceccible(true);即暴力反射
-
案例:
需求:写一个“框架”,不能改变给雷的任意代码前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 实现: 1,配置文件 2,反射 步骤: 1,将需要创建的对象的全类名和需要执行的方法定义在配置文件中 2,在程序中加载读取配置文件 3,使用反射技术来加载类文件进内存 4,创建对象 5,执行方法
具体步骤:
1,在src下建立file文件pro.propecties
className=indi.zxp.demo.Student
methodName=sleep
2,在indi.zxp.demo包下建立Student类
package indi.zxp.demo;
public class Student {
public void sleep(){
System.out.println("sleep...");
}
}
3,建立ReflectTest类
package indi.zxp.demo;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectTest {
public static void main(String[] args) throws Exception{
// Person p = new Person();
// p.eat();
//1,加载配置文件
//1.1创建Properties对象
Properties pro = new Properties();
//1.2加载配置文件,转换为一个集合
//1.2.1获取class目录下的配置文件
ClassLoader classLoader= ReflectTest.class.getClassLoader();
InputStream is= classLoader.getResourceAsStream("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);
//执行方法
method.invoke(obj);
}
}
4,结果
补充:
反射
反射
大白话说Java反射:入门、使用、原理