Java反射机制:框架设计的灵魂

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44002167/article/details/96502315

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. 案例

    需求:写一个“框架”,不能改变给雷的任意代码前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
    	实现:
    		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反射:入门、使用、原理

猜你喜欢

转载自blog.csdn.net/qq_44002167/article/details/96502315