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 @Override 29 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>
posted on 2014-09-25 16:05 宁静致远,一览众山小 阅读(602) 评论(0) 编辑 收藏 举报