反射调用

本文将介绍如何在Android开发中利用反射API获取IMEI号码,并通过反射调用类的方法和构造函数,深入理解Java反射机制在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初次使用反射,记录一下:

 

 

	/**
	 * 获取手机imei
	 */
	public void getIMEI() {
		try {
		    Class<?> clazz = Class.forName("android.telephony.MzTelephonyManager");
		            Method method = clazz.getMethod("getDeviceId");
		            Object temp = method.invoke(null);
            //Object temp = ReflectHelper.invokeStatic("android.telephony.MzTelephonyManager", "getDeviceId", null);
            if (null != temp && temp instanceof String) {
                String imei = (String)temp;
                if (imei != null && !imei.equals("")) {
                    IMEI = imei;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            // 兼容低版本和非FlymeOS
            try {
            	
                TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
                if (null == tm) {
                	IMEI = "imei获取失败";
                }
                String imei = tm.getDeviceId();
                if (imei != null && !imei.equals("")) {
                    IMEI = imei;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
}

 

 

以下是在网上找的反射详细讲解:

 

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;


public class CallMethod {

 public static void main(String[] args) throws Exception {
  // 获取TestClass的Class对象
  Class testClass = Class.forName(TestClass.class.getName());

  
  // (1)使用Class对象的newInstance方法创建一个实例,这种方法用默认构造方法创建对象
  TestClass objectA = (TestClass) testClass.newInstance();
  System.out.println("Class的newInstance() 方法创建默认TestClass实例: "
    + objectA.toString());
  // (2)使用构造方法创建实例。这就可以使用带参数的构造方法创建实例了
  Constructor[] cons = testClass.getDeclaredConstructors();
  System.out.println("testClass有 " + cons.length + " 个构造方法");
  Constructor con = null;
  for (int i = 0; i < cons.length; i++) {
   con = cons[i];
   // 默认构造函数
   if (con.getParameterTypes().length == 0) {
    // 调用Constructor的newInstance方法创建实例
    objectA = (TestClass) con.newInstance(null);
    System.out
      .println("Constructor 的 newInstance() 方法创建默认TestClass实例: "
        + objectA.toString());
   } else {
    // 带参数的构造函数
    objectA = (TestClass) con.newInstance(new Object[] {
      new Integer(55), new Integer(88) });
    System.out
      .println("Constructor 的 newInstance() 方法创建带参数的TestClass实例: "
        + objectA.toString());
   }
  }

  
  // 获取所有方法
  Method[] methods = testClass.getMethods();
  // 获取某个特定的无参数的方法
  Method saddMethod1 = testClass.getMethod("sadd", null);
  Method addMethod1 = testClass.getMethod("add", null);
  // 获取某个特定的有参数的方法
  Method saddMethod2 = testClass.getMethod("sadd", new Class[] {
    int.class, int.class });
  Method addMethod2 = testClass.getMethod("add", new Class[] { int.class,
    int.class });

  
  // 调用不带参数的静态方法
  int result = ((Integer) saddMethod1.invoke(null, null)).intValue();
  System.out.println("调用不带参数的静态方法sadd: " + result);
  // 调用带参数的静态方法
  result = ((Integer) saddMethod2.invoke(null, new Object[] {
    new Integer(30), new Integer(70) })).intValue();
  System.out.println("调用带参数30, 70的静态方法sadd: " + result);

  
  objectA = (TestClass) testClass.newInstance();
  // 调用不带参数的实例方法
  result = ((Integer) addMethod1.invoke(objectA, null)).intValue();
  System.out.println("调用不带参数的实例方法add: " + result);
  // 调用带参数的实例方法
  result = ((Integer) addMethod2.invoke(objectA, new Object[] {
    new Integer(130), new Integer(170) })).intValue();
  System.out.println("调用带参数130, 170的实例方法add: " + result);

  // 不能访问私有方法
//  Method sub = testClass.getMethod("sub", null);
//  System.out.println(sub.invoke(objectA, null));
 }

 // 测试类
 class TestClass {
  // 两个静态属性
  static int sa = 100;
  static int sb = 50;
  // 两个实例属性
  int a;
  int b;
  // 默认构造方法
  public TestClass() {
   this.a = 5;
   this.b = 10;
  }
  // 带参数的构造方法
  public TestClass(int a, int b) {
   this.a = a;
   this.b = b;
  }

  // 静态方法,实现add功能
  public static int sadd() {
   return sa + sb;
  }
  public static int sadd(int a, int b) {
   return a + b;
  }
  // 实例方法,实现add功能
  public int add() {
   return this.a + this.b;
  }
  public int add(int a, int b) {
   return a + b;
  }
  public String toString() {
   return "a = " + this.a + "; b = " + this.b;
  }
  // 私有方法
  private int sub() {
   return this.a - this.b;
  }
 }
}

 

 

 

 

 

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值