2020-08-10反射

作者: 智障猿 | 来源:发表于2020-08-14 09:06 被阅读0次

反射:框架设计的灵魂

框架:半成品的软件。可以在框架的基础上进行软件开发,简化编码
反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
①可以在程序运行过程中,操作这些对象。
②可以解耦,提高程序的可扩展性。

反射的操作

  • 获取class对象的方式:
    Class.forName(”全类名“):将字节码文件加载到内存,返回class对象(多用于配置文件,将类名定义在配置文件中。读取文件,加载类)
    类名.class:通过类名的属性class获取(多用于参数的传递)
    对象.getClass():getClass()方法在Object类中定义的(多用于对象的获取字节码的方式)
  • 使用class对象的功能
  1. 获取功能:
    ①获取成员变量们:
方法 说明
getFields() 获取所有public修饰的成员变量
getField(String name) 获取指定名称的public修饰的成员变量
getDeclaredFields() 获取所有成员变量,不考虑修饰符
getDeclaredField(String name) 获取指定的成员变量

忽略访问权限修饰符的安全检查暴力反射
成员变量.setAccessible(true)
②获取构造方法们:

方法 说明
getConstructors() 获得所有public修饰的构造方法
getConstructor(类<?>...parameterTypes) 根据参数返回public修饰的指定的构造方法
getDeclaredConstructors()
getDeclaredConstructor(类<?>...parameterTypes)

忽略访问权限修饰符的安全检查暴力反射
构造方法对象.setAccessible(true)
③获取成员方法们:

方法 说明
getMethods() 获得public修饰的成员方法
getMethod(String name,类<?>...parameterTypes)
getDeclaredMethods() 获得所有的成员方法
getDeclaredMethod(String name,类<?>...parameterTypes)

忽略访问权限修饰符的安全检查暴力反射
成员方法.setAccessible(true)
④获取类名

方法 说明
getName() 获得全类名

⑤获取注解

方法 说明
getAnnotation(注解名.class) 获得该类的注解对象

⑥判断有无注解

方法 说明
(class,method,field).isAnnotationPersent() 判断当前类,方法,变量是否有注解
  1. 对成员变量对象的操作
方法 说明
get(Object o) 获得成员变量的值
set(Object,value) 设置成员变量的值
  1. 对构造方法对象的操作
方法 说明
newInstance(Object...initargs) 创建对象
  1. 对注解对象的操作
方法 说明
注解对象.注解属性(抽象方法)名 获得属性值

案例

写一个框架,可以帮我们创建任意类的对象,并且执行其中任意的方法

  • 实现
    ①配置文件
    ②反射
  • 步骤
    ①将需要创建的对象的全类名和需要执行的方法定义到配置文件中
    ②在程序中加载读取配置文件(properties.load())
    ③使用反射技术来加载类文件进内存
    ④创建对象
    ⑤执行方法
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException {
//        1. 加载配置文件
        //1.1创建properties对象
        Properties properties = new Properties();
        //1.2加载配置文件,转化为一个Map
        //1.2.1获取class目录下的配置文件
        
        ClassLoader classLoader = test.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");

        properties.load(resourceAsStream);
//        2.获取配置文件中定义的数据
        String className = properties.getProperty("className");
//        3.加载该类到内存
        Class<?> aClass = Class.forName(className);
//        4.创建对象
        Constructor<?> constructor = aClass.getConstructor();
        Object o = constructor.newInstance();
//        5.创建方法对象
        String method1 = properties.getProperty("methodName");
        Method method = aClass.getMethod(method1);
        Object str = method.invoke(o);
        System.out.println(str);
    }
}

相关文章

  • 2020-08-10反射

    反射:框架设计的灵魂 框架:半成品的软件。可以在框架的基础上进行软件开发,简化编码反射:将类的各个组成部分封装为其...

  • 如果可以请改变现状

    如果可以请试着改变现状 伸手触云 关注 7.746 · 字数 254 · 阅读 763 2020-08-10 16...

  • 2020-08-16 思考成长周复盘

    一 时间 2020-08-10 ~ 2020-08-16 二 围绕思考成长所做的事情 1.每日早起,每日利用精力最...

  • 文件批量替换修改及格式转换助手我的ABC软件工具箱—XCLWin

    最新版 v3.7(2020-08-10) 添加根据模板文件和 Excel 数据批量生成文件的功能(类似于 Word...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 医案—竹叶汤

    2020-08-10 邹某,女,39岁,产后8月,母乳喂养。 3天前患者忽然感怕冷,今日感发热,自测体温37.6...

  • 2020-08-10

    2020-08-10 姓名 :曹静杰 企业名称 : 辽宁辽阳丛迪服装有限公司 组别 388期 反省1组 志工529...

  • 独立开发者记录的第六周

    记录日期(2020-08-10) 这周是记录的第六周了,这周继续忙,每天都很充实。 不多介绍了,像了解我具体是干什...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

网友评论

    本文标题:2020-08-10反射

    本文链接:https://www.haomeiwen.com/subject/ruvddktx.html