Java:反射、注解、泛型

news/2024/5/19 4:01:08 标签: java, 注解, 反射, 泛型

一、反射

作用:做一般做不到的事情

使用场景:插件换肤、插件式开发

所有反射功能都是基于class字节码,包含三个部分

  • Filed:属性
  • Constructor:构造函数
  • method:方法

java">public class TestBean {
    private String name="xiaoming";//属性

    public TestBean(String name,int age){// 构造函数
        this.name = name;
    }

    public void sysName(){//方法
        Log.e("TAG",name);
    }
    
    private void say(String desc){
        Log.e("TAG",name + " : "+desc);
    }
}

构造方法调用

java">   try {
        Constructor<TestBean> constructor = TestBean.class.getDeclaredConstructor(String.class, int.class);
        constructor.setAccessible(true);
        TestBean testBean = constructor.newInstance("名称", 18);
        testBean.sysName();
    } catch (Exception e) {
        e.printStackTrace();
    }

TestBean testBean = TestBean.class.newInstance(参数类型);

getDeclaredConstructor 从所有的构造方法中找
getConstructor 从公共构造方法中去找

constructor.setAccessible(true);//设置权限

方法调用

java">Method method = TestBean.class.getDeclaredMethod("say",String.class);
method.setAccessible(true);
method.invoke(constructor,"描述信息");

属性调用

java">Field field = TestBean.class.getDeclaredField("name");
field.setAccessible(true);
String name = (String) field.get(testBean);

二、注解

注解只是一个标识,没有具体的功能

java">@Target(ElementType.FIELD)  
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewById {// @interface 代表注解
    int value();
}

@Target:放在哪个位置

  • ElementType.METHOD:作用于方法
  • ElementType.Type:作用于类
  • ElementType.Field:作用于属性

@Retention:

  • RetentionPolicy.RUNTIME:运行时,如:xUtils
  • RetentionPolicy.CLASS:编译时(打包时),如:ButterKnife
  • RetentionPolicy.SOURCE:编程时

注解结合反射解决findViewById注入

java">public class ViewUtils {
    public static void inject(Activity activity) {
        // 1.获取所有的属性
        Field[] fields = activity.getClass().getDeclaredFields();
        // 2.过滤关于 ViewById 属性
        for (Field field : fields) {
            ViewById viewById =  field.getAnnotation(ViewById.class);
            if(viewById != null){
                // 3.findViewById
                View view = activity.findViewById(viewById.value());
                // 4.反射注入
                field.setAccessible(true);
                try {
                    // activity 属性所在类,view 代表的是属性的值
                    field.set(activity,view);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

三、泛型

泛型:在任何地方出现的,代表的是同一类型

方法泛型:作用在方法上

上限:类名<? extends 类> 对象名称  类和其子类

下限:类名<? super 类> 对象名称  类和其父类


http://www.niftyadmin.cn/n/395781.html

相关文章

【Linux系统基础快速入门详解】Linux编辑器vi多种命令模式精讲及高级快捷常用命令技巧

Vi是一种文本编辑器,它提供了多种命令模式,包括命令模式、插入模式、可视模式等。本文将讲解Vi的多种命令模式及其常用命令技巧,以及它们的原理、使用场景和实例。 命令模式 命令模式是Vi的默认模式,用于执行各种命令。以下是一些常用的命令: i: 进入插入模式,在光标所…

认识协议【网络基础】

文章目录 什么是协议结构化数据结构化数据非结构化数据半结构化数据 结构化数据的传输序列化和反序列化 网络版计算器概述制定协议通过字符串传输结构化数据序列化与反序列化 实现计算器网络相关接口框架服务端客户端 制定协议请求响应发送和接收数据 计算逻辑测试存在的问题 T…

树莓派安装homeassistant

一.安装doker sudo mkdir has # 由于后面配置需要 我在/home/pi/下面建了个 has文件夹管理homeassistant在命令行中运行以下命令以更新软件包列表&#xff1a; sudo apt update安装Docker的依赖项。运行以下命令以安装所需的软件包&#xff1a; sudo apt install apt-transp…

【学习日记2023.6.4】之 Linux入门

1. Linux简介 1.1 主流操作系统 不同领域的主流操作系统&#xff0c;主要分为以下这么几类&#xff1a; 桌面操作系统、服务器操作系统、移动设备操作系统、嵌入式操作系统。接下来&#xff0c;这几个领域中&#xff0c;代表性的操作系统是那些? 1). 桌面操作系统 操作系统特…

10-风险管理:如何应对暗礁风险?系统化风险管理让你安心!

项目已到中期&#xff0c;目前看很顺利&#xff0c;但隐隐不安&#xff1a;项目进展越平稳&#xff0c;我越觉不安。我担心项目会不会存在什么风险&#xff0c;而自己却没发现。 这种担心很必要&#xff0c;因为项目从构思起&#xff0c;就存在风险。光担心没用&#xff0c;项…

vcruntime140.dll如何修复

VCRUNTIME140.dll是Windows操作系统上一个非常重要的动态链接库文件&#xff0c;它是由Microsoft Visual C Runtime提供的运行时库文件之一&#xff0c;被许多应用程序用来进行编译和运行。如果该文件丢失或损坏&#xff0c;很多应用程序就无法正常运行&#xff0c;这可能会带来…

Numpy---生成数组的方法、从现有数组中生成、生成固定范围的数组

1. 生成数组的方法 np.ones(shape, dtypeNone, orderC) 创建一个所有元素都为1的多维数组 参数说明: shape : 形状&#xff1b; dtypeNone: 元素类型&#xff1b; order &#xff1a; {‘C’&#xff0c;‘F’}&#xff0c;可选&#xff0c;默认值&#xff1a;C 是否在内…

身份证的那些事——再也不用查询软件了直接看懂身份证号

身份证的那些事——再也不用查询软件了直接看懂身份证号 才知道&#xff0c;身份证后4位原来是这个意思&#xff0c;涨知识了&#xff0c;好多人还不知道 一 与我们生活息息相关的证件 不知道大家有没有发现&#xff0c;近距离的出门&#xff0c;大家喜欢轻装上阵&#xff0…