首页 > 代码库 > Android反射机制技术的使用示例

Android反射机制技术的使用示例

 转:http://blog.csdn.net/lfdfhl/article/details/10311505

  1 package com.nthm.androidtestActivity;  2   3 import java.io.File;  4 import java.lang.reflect.Constructor;  5 import java.lang.reflect.Field;  6 import java.lang.reflect.Method;  7 import com.nthm.androidtest.R;  8 import android.os.Bundle;  9 import android.app.Activity; 10 import android.content.ContextWrapper; 11 /** 12  * Demo描述: 13  * Android中Java反射技术的使用示例 14  * 在Java中描述字节码文件(xxx.class)的类叫Class 15  * 反射的过程可视为剖析Class的过程 16  */ 17 public class MainActivity extends Activity { 18     @Override 19     protected void onCreate(Bundle savedInstanceState) { 20         super.onCreate(savedInstanceState); 21         setContentView(R.layout.main); 22         init(); 23     } 24     private void init(){ 25         try { 26             /** 27              * 1 反射出无参的构造方法并得到对象 28              * 注意: 29              *      1 在Class.forName()中应该传入含有包名的类全名 30              *      2 newInstance()方法的本质是调用类的无参Public构造方法 31              */ 32             String className1="com.nthm.androidtestBean.Worker"; 33             Class clazz1=Class.forName(className1); 34             Object object1=clazz1.newInstance(); 35             System.out.println("object1.toString()="+object1.toString()); 36             /** 37              * 2 反射出带参数的构造方法并得到对象 38              */ 39             String className2="com.nthm.androidtestBean.Worker"; 40             Class clazz2=Class.forName(className2); 41             Constructor constructor1=clazz2.getConstructor(int.class,String.class); 42             Object object2=constructor1.newInstance(18,"小明"); 43             System.out.println("object2.toString()="+object2.toString()); 44              45             /** 46              * 3 获取类的私有(private)字段 47              * 注意: 48              *      获取共有(public)字段应调用clazz3.getField(name)方法 49              */ 50             String className3="com.nthm.androidtestBean.Worker"; 51             Class clazz3=Class.forName(className3); 52             Field ageField1=clazz3.getDeclaredField("age"); 53             System.out.println("ageField1="+ageField1); 54              55             /** 56              * 4 获取和更改某个对象的私有字段 57              *   即模拟get()和set()方法 58              */ 59             String className4="com.nthm.androidtestBean.Worker"; 60             Class clazz4=Class.forName(className4); 61             Field ageField2=clazz4.getDeclaredField("age"); 62             Object object4=constructor1.newInstance(18,"小明"); 63             //取消访问私有字段的合法性检查 64             ageField2.setAccessible(true); 65             //获取对象的私有字段 66             Object ageObject4=ageField2.get(object4); 67             System.out.println("ageObject4="+ageObject4.getClass().getName()); 68             System.out.println("ageObject4="+ageObject4); 69              70             //再更改对象的私有字段的值 71             ageField2.set(object4, 9527); 72             //重新获得 73             Object ageObject5=ageField2.get(object4); 74             System.out.println("ageObject5="+ageObject5); 75              76             /** 77              * 5 调用对象的带参数的方法 78              */ 79             String className5="com.nthm.androidtestBean.Worker"; 80             Class clazz5=Class.forName(className5); 81             Method method=clazz5.getMethod("printMessage", String.class,int.class,int.class); 82             Object object5=clazz5.newInstance(); 83             method.invoke(object5, "周星星",50,9527); 84              85             //获取ContextWrapper对象中的mBase对象,该变量保存了ContextImpl对象 86             Field field=ContextWrapper.class.getDeclaredField("mBase"); 87             //跳过属性的修饰(public private protect)检查 88             field.setAccessible(true); 89             //获取对象的指定属性的值 90             Object obj=field.get(this); 91             //根据获取的值所属的类来获取该类中的其他属性 92             field=obj.getClass().getDeclaredField("mPreferencesDir"); 93             //跳过属性的修饰(public private protect)检查 94             field.setAccessible(true); 95             File file=new File("/sacard"); 96             //对该属性重新赋值 97             field.set(obj, file); 98         } catch (Exception e) { 99             System.out.println(e.toString());100         }101     102     }103 104 }
 1 package com.nthm.androidtestBean; 2  3 public class Worker { 4     private int age; 5     private String name; 6     public Worker() { 7         super(); 8         System.out.println("---> public Worker(){ }"); 9     }10     public Worker(int age, String name) {11         super();12         this.age = age;13         this.name = name;14         System.out.println("---> public Worker(int age, String name){ }");15     }16     public int getAge() {17         return age;18     }19     public void setAge(int age) {20         this.age = age;21     }22     public String getName() {23         return name;24     }25     public void setName(String name) {26         this.name = name;27     }28     @Override29     public String toString() {30         return "Worker [age=" + age + ", name=" + name + "]";31     }32     33     public void printMessage(String name,int age,int salary){34         System.out.println("name="+name+",age="+age+",salary="+salary);35     }36     37 }
 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2     xmlns:tools="http://schemas.android.com/tools" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     > 6  7     <TextView 8         android:layout_width="wrap_content" 9         android:layout_height="wrap_content"10         android:text="Android中Java反射技术的使用" 11         android:layout_centerInParent="true"/>12 13 </RelativeLayout>

 

Android反射机制技术的使用示例