android反射开启通知_Android中反射的简单应用

自己对反射的理解和应用还处于比较浅显的阶段,写这篇文章更多在于整理总结,也就是帮助自己进一步的理解和学习反射机制。

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

java中类反射

反射是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。

简单总结这些定义,那就是反射可以让我们获得一个类的所有信息,包括私有属性和私有方法,对于我们这种小白,先知道这点就可以啦,那在java中如何使用发射呢。这里我们随便创建一个类来演示。比如说创建一个Book类:

public class Book implements Parcelable

{

private int id=1;

private String name="android";

private String author="wf";

private String getName()

{

return name;

}

}

Book类中属性和方法都是私有的,现在我们通过反射来访问这些属性和方法。

String s = null;

try

{

Class> bookClass = Class.forName("cc.abto.demo.Book");//完整类名

Object book = bookClass.newInstance();//获得实例

Method getAuthor = bookClass.getDeclaredMethod("getName");//获得私有方法

getAuthor.setAccessible(true);//调用方法前,设置访问标志

s = (String) getAuthor.invoke(book);//使用方法

}

catch (Exception e)

{

e.printStackTrace();

}

可以看到上面代码中我们用Class和Method这两个类完成了反射,这两个类分别对应了类和方法,也就是包装了类和方法的信息,下面对反射的部分API做一下简单介绍:

Class类:代表一个类,位于java.lang包下

Field类:代表类的成员变量(成员变量也称为类的属性)

Method类:代表类的方法

Constructor类:代表类的构造方法

Array类:提供了动态创建数组,以及访问数组的元素的静态方法

在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。 java中的Class三种获取方式:

//使用Class类的静态方法forName(),用类的名字获取一个Class实例

Class> bookClass = Class.forName("cc.abto.demo.Book");

//利用对象调用getClass()方法获取该对象的Class实例

Book book = new Book();

Class extends Book> bookClass = book.getClass();

//运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的Class实例

Class bookClass = Book.class;

Class type = Integer.TYPE;

然后再贴一些常用的方法

public Annotation[] getAnnotations () //获取这个类中所有注解

getClassLoader() //获取加载这个类的类加载器

getDeclaredMethods() //获取这个类中的所有方法

getReturnType() //获取方法的返回类型

getParameterTypes() //获取方法的传入参数类型

isAnnotation() //测试这类是否是一个注解类

getDeclaredConstructors() //获取所有的构造方法

getDeclaredMethod(String name, Class… parameterTypes)// 获取指定的构造方法(参数:参数类型.class)

getSuperclass() //获取这个类的父类

getInterfaces()// 获取这个类实现的所有接口

getFields() //获取这个类中所有被public修饰的成员变量

getField(String name) //获取指定名字的被public修饰的成员变量

newInstance() //返回此Class所表示的类,通过调用默认的(即无参数)构造函数创建的一个新实例

更多的方法和方法的注解大家可以查看文档。

Android中的简单应用

查看Android SDK的源码时候。你会发现很多类或方法中经常加上了“@hide”注释标记,这些API是不允许在程序中调用的。Hidden API之所以被隐藏,是想阻止开发者使用SDK中那些未完成或不稳定的部分(接口或架构)。如图所示

2958d7676593

所以在开发中,我们不仅可以通过反射获取私有属性和方法,也可以利用反射获取一些SDK对外部隐藏的API,比如说前阵子在做蓝牙开发的时候,自动配对的一些方法在API 19以后才对外开放的,这边我们就可以使用反射来实现配对功能了

try

{

Class bluetoothDeviceClass = BluetoothDevice.class;

bluetoothDeviceClass.getMethod("setPin", byte[].class).invoke(device, "1234".getBytes());

bluetoothDeviceClass.getMethod("createBond").invoke(device);

bluetoothDeviceClass.getMethod("setPairingConfirmation", boolean.class).invoke(device, true);

bluetoothDeviceClass.getMethod("cancelPairingUserInput").invoke(device);

}

catch (Exception e)

{

e.printStackTrace();

}

反射的好处

反射不仅可以让我们获得隐藏的方法和属性,还可以让对象的实例化从编译时转化为运行时,因为我们可以通过Class.forName("cc.abto.demo.Book").newInstance()的方法来生成新的实例,而这边的"cc.abto.demo.Book"是一个字符串,完全可以用变量来代替,再结合抽象工厂模式什么的,我们就可以很大程度上对程序应用中的功能模块进行解耦合。可能这边简单几句没能解释清楚,大家可以看看《大话设计模式》之类的书,里面就介绍的比较清楚明白了。

反射的弊端

反射带来的两大弊端可能就是安全和性能问题了吧,这方面我知之甚少,有待进一步的了解和学习。

最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV 例程200篇 目录-202205更新】

欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 【OpenCV 例程200篇 目录】 更新日期:2022-05-12 【youcans 的 OpenCV 例程200篇】01. 图像的读取(cv2.im…

最大值平均值和排序

根据文本提示输入五个年龄,点击Enter之后程序会输出五个年龄中最大的年龄,平均年龄即年龄从小到大的排序分别是啥。 结果演示 代码演示 package com.nine; import java.util.Scanner; import java.util.Arrays; public class Shuzu {public static v…

【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割 5. 区域分割之聚类方法 5.2 基于超像素的区域分割 超像素图像分割基于依赖于图像的颜色信息及空间关系信息,将图像分割为远超于目标个数、远小于像素数量的超像素块&…

判断三角形是否是直角三角形

根据文本提示分别输入第一第二第三条三角形的边长,程序会根据勾股定理计算是否是直角三角形,如果是直角三角形,会显示该三角形是直角三角形,如果不是直角三角形则显示该三角形不是直角三角形。 结果演示 代码演示 package com.…

【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较 5. 区域分割之聚类方法 5.3 SLIC 超像素区域分割 SLIC 基于网格化 K-means 聚类方法,原理简单,计算复杂度为O(N),N 为像素点个数。 S…

【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割 5.4 SEEDS 超像素区域分割 超像素个体应在视觉上一致,特别是颜色应尽可能均匀。SLIC 使用欧几里德距离来度量像素点的相似度,不能反映颜色的方差。 SEED…

能否组成三角形

根据三角形三边长判断是否可以组成一个三角形,如果输入的不对会给出相应的提示。 结果演示 代码演示 package com.nine; import java.util.Scanner; public class ZhiJiao {public static void main(String[] args) {Scanner scan new Scanner(System.in);System…

【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割

【OpenCV 例程200篇 总目录-202206更新】** 【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割 5.5 LSC 超像素区域分割 线性谱聚类(Linear Spectral Clustering,LSC)是 SLIC 的改进方案,可以生成紧凑且均匀的超像素&…

修改SqlServer的登录密码

我们每次打开SqlServer数据库的时候首先会让我们登录用户名和密码,那么我们如何修改之前设定的密码呢? 1.打开我们的SqlServer 2.点击安全性,选择自己登录SqlServer的账户双击看到如下页面 3.在密码和确认密码的输入框中修改我们的新密码。…

java递归栈_java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶...

import java.util.Stack;public class ReverseStackRecursive {/*** Q 66.颠倒栈。* 题目:用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。* 颠倒之后的栈为{5,4,3,2,1},5处在栈顶。*1. Pop the top element*2. Reverse the remaining st…

Redis DeskTop Manager 使用教程

redis desktop manager windows 是一款能够跨平台使用的开源性redis可视化工具。 redis desktop manager主要针对redis开发设计,拥有直观强大的可视化界面,具有完善全面的数据操作功能,可以针对目标key执行rename,delete&#xf…

【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较

【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较 5.2 基于超像素的区域分割 超像素图像分割基于依赖于图像的颜色信息及空间关系信息,将图像分割为远超于目标个数、远小于像素数量的超像素块,达到尽可能保留图像中所有目标的边缘信息的目的…

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 Mean Shift

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景) 【youcans 的 OpenCV 例程200篇】179.图像分割…

在线答题系统

使用Jquery制作了一个在线答题系统 功能分析 1.开始界面 2.结束界面 3.题目的内容和选项的选择 4.题目的切换 5.分数的计算 6.判断是否选中选项 效果演示 代码演示 一 . html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht…

【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

element 搜索匹配_分享一个element-ui级联选择器的搜索问题,顺便问下有没有解决方案。...

楼主做的是一个三级联动的城市筛选&#xff0c;后台给过来的数据并不全是按照label, value, children的key给到我&#xff0c;数据格式但是官方的props只能指到一级&#xff0c;具体指到2-3级我还不没弄明白。于是 &#xff0c; 需要自己转换:options"options"v-mode…

【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

点击出现小心心

使用鼠标的点击事件&#xff0c;使用鼠标点击任意地方的时候&#xff0c;点击的地方会出现一个小心&#xff0c;每一次出现的小心的颜色都不一样。 原理分析 1.设置点击的范围 2.鼠标点击事件 3.记录鼠标点击的位置在此位置出现一颗小心 4.小心向上浮动并且自动消失 5.小心颜色…

【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)

【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法 【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法 【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法&#xff08;框选前景&#xff09; 【youcans 的 OpenCV 例程200篇】179.图像分割…

VScode 透明背景设置

我们通常使用VScode开发项目&#xff0c;时间长了不免有些疲惫&#xff0c;在此教给大家一个设置VScode 透明背景的方法&#xff0c;给大家的代码之旅带来一点乐趣。 1.首先在vscode扩展中&#xff0c;找到并下载background这个插件&#xff0c;快捷键Ctrlshiftx 2.完成第一步…