反射调用

来源:互联网 发布:都柏林圣三一学院 知乎 编辑:程序博客网 时间:2024/06/01 12:46

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


/** * 获取手机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;  } }}


0 0
原创粉丝点击