首页 > 其他分享 >Android反射的使用

Android反射的使用

时间:2023-05-28 18:56:04浏览次数:37  
标签:aClass 反射 int Class final class 使用 Android public

public class MyReflectUtils {
private MyReflectUtils(int i){}

public MyReflectUtils(){}
/**
* 三种方式获取Class对象
* Class对象是一个单例
* @param obj
* @param classFullName
*/
public static void getMyClass(Object obj,String classFullName){
//1.通过类引用获取
Class<MyReflectUtils> aClass = MyReflectUtils.class;
//2.通过对象的方法获取
Class<?> oClass = obj.getClass();
//3.通过类的全路径获取
try {
Class<?> nClass = Class.forName(classFullName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 获取类实例,两种方法
*/
public static void getMyInstance(){
Class<?> aClass = MyReflectUtils.class;
//1.只能是包含无参构造且构造是public类型的类
//过时了,由clazz.getDeclaredConstructor().newInstance()替代
try {
final Object aInstance = aClass.newInstance();
System.out.println(aInstance);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}

//2.通过获取类声明的构造函数
//2.1
final Constructor<?>[] dConstructors = aClass.getDeclaredConstructors();
for (Constructor<?> item : dConstructors) {
//返回包含了不管用什么权限修饰符修饰的所有构造方法
}
//2.2
try {
final Constructor<?> dConstructor = aClass.getDeclaredConstructor(int.class);//通过形参类型获取相应的构造
// final Constructor<?> constructor = aClass.getConstructor();//获取仅由public修饰的构造
if (!dConstructor.isAccessible()){
dConstructor.setAccessible(true);//注意:构造可能是私有的,需要修改构造的修饰符
}
final Object dInstance = dConstructor.newInstance(100);//根据相应构造的实参生成实例
System.out.println(dInstance);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}

/**
* 调用方法
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws InstantiationException
*/
public static void invokeMyMethod() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> aClass = MyReflectUtils.class;
//第一步:还是通过Class对象获取声明的方法对象
//方式1.获取所有的公共方法,包括实例方法和静态方法,包括从父类继承的方法
// final Method[] pMethods = aClass.getMethods();
//方式2.通过方法名去获取某个具体的公共方法,注意的是这个方法必须是public修饰的
// final Method pMethod = aClass.getMethod("method_name");
//方式3.获取此类中声明的所有的方法,不包括继承的方法
// final Method[] dMethods = aClass.getDeclaredMethods();
//方式4.通过方法名去获取某个具体的方法,不管这个方法是什么修饰符修饰的
// final Method pMethod = aClass.getDeclaredMethod("method_name",int.class);

//第二步:方法调用
//1.静态方法调用,invoke的obj参数为null
final Method dSMethod = aClass.getDeclaredMethod("testStaticMethod",int.class);
if (!dSMethod.isAccessible()){
dSMethod.setAccessible(true);//修改修饰符才能访问
}
final Object sMInvoke = dSMethod.invoke(null,1);
//2.实例方法的访问
final Method dMethod = aClass.getDeclaredMethod("testPrivateMethod",int.class);
if (!dMethod.isAccessible()){
dMethod.setAccessible(true);//修改修饰符才能访问
}
final Constructor<?> dConstructor = aClass.getDeclaredConstructor();
if (!dConstructor.isAccessible()){
dConstructor.setAccessible(true);
}
final Object dInstance = dConstructor.newInstance();
final Object dMInvoke = dMethod.invoke(dInstance,1);//传入具体的实例对象以调用
}

/**
* 访问属性,和访问方法差不多
* @throws NoSuchFieldException
*/
public static void invokeMyField() throws NoSuchFieldException {
Class<?> aClass = MyReflectUtils.class;
final Field[] pFields = aClass.getFields();
final Field[] dFields = aClass.getDeclaredFields();
final Field aField = aClass.getDeclaredField("a");
if (!aField.isAccessible()){
aField.setAccessible(true);
}
// aField.set(obj,1);
}

private int a;
public int b;

private int testPrivateMethod(int i){
return i;
}

public void testPublicMethod(){

}

private static void testStaticMethod(int i){

}

}

标签:aClass,反射,int,Class,final,class,使用,Android,public
From: https://www.cnblogs.com/maowuge/p/17438646.html

相关文章

  • Windows使用iscsi存储
    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。邮箱:[email protected]说明在windos下挂载使用iscsi磁盘,需要使用iscsi发起程序连接到远端磁盘,如果该磁盘有多条路径还需要配置多路径软件把多块磁盘聚合成一块磁盘,满足系统的高可用需求。1识别iscsi磁盘通......
  • webpack-loader-使用babel-loader转换处理高级的js语法
    webpack只能打包处理一部分高级的JavaScript语法。对于那些webpack无法处理的高级js语法,需要借助于babel-loader进行打包处理。例如webpack无法处理下面的JavaScript代码://定义装饰器函数functioninfo(target){target.info='Personinfo.'}//定义一个普通的类@info......
  • [转]一篇文章教你学会使用三维重建知名开源系统
    如何把一组图像转换为3D模型,这可能是三维重建初学者们最常遇到的问题。这个过程融合了计算机视觉、计算机图形学、图像处理等多门学科的知识,是一套非常复杂的工程系统,许多同学想要学习却苦于没有资料参考,导致入门难度大大提高。为了帮助想要学习三维重建的同学快速上手实践,本......
  • ESP8266WiFi模块与Android实现数据通信
    ESP8266模块三种模式:    1、STA模式(客户端模式):ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制    2、AP模式(接入点模式):ESP8266模块作为热点,手机或电脑直接与模块连接,实现局域网无线控制    3、STA+AP模式(两种模式并存):ESP826......
  • 如何使用chatgpt编写代码
    功能列举回答编程问题我想让你充当Stackoverflow的帖子。我将提出与编程有关的问题,你将回答答案是什么。我希望你只回答给定的答案,在没有足够的细节时写出解释。当我需要用英语告诉你一些事情时,我会把文字放在大括号里{XXXXXX}。写代码你现在是一个[程序语言]专家,请帮我用......
  • Git日常使用技巧 - 笔记
    Git日常使用技巧-笔记Git是目前世界上最先进的分布式版本控制系统学习资料廖雪峰学习视频https://www.bilibili.com/video/BV1pX4y1S7Dq/?spm_id_from=333.337.search-card.all.click&vd_source=2ac127043ccd79c92d5b966fd4a54cd7Git命令在线练习工具https......
  • Unity的IPostGenerateGradleAndroidProject:深入解析与实用案例
    UnityIPostGenerateGradleAndroidProjectUnity是一款流行的跨平台游戏引擎,它支持多种平台,包括Android。在Unity中,我们可以使用IPostGenerateGradleAndroidProject接口来自定义Gradle构建过程。本文将介绍如何使用IPostGenerateGradleAndroidProject接口,并提供三个使用例子。IPos......
  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
     第一个错误 刷新后出现第二个 org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.admin.adminFace_jsp 解决方法:1.1检查WEB-INF下的lib文件夹里是否导入了写jstl-1.2.jar(jstl.jar),standard1.1.jar(standard.jar)如果没有......
  • 转载-如何结合FT2232HL/CMSIS-DAP+Eclipse+OpenOCD软硬件工具使用SWD调试接口在Window
    原文链接:https://blog.csdn.net/zhuwade/article/details/121944736由于我们公司自己需要开发烧录工具,本人通过google搜相关文档和看ARM公司的技术文档,终于实现了这个功能。因为涉及的内容知识点比较多,对于玩嵌入式MCU的小白来说要普及的知识,逐个介绍篇幅会比较长,本文中只介绍......
  • Gradle 使用 Kotlin 的情况下设置使用 UTF-8
    找了好久才找到该怎么整,在此记录一下原本的样子Groovy下设置UTF-8:tasks.withType(JavaCompile){options.encoding="UTF-8"}但是现在改了,食大便了Kotlin下设置UTF-8tasks.withType<JavaCompile>{options.encoding="utf-8"}将此段话加入到build......