MainActivity如下:

package cn.testreflect;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.os.Bundle;
import android.app.Activity;
/**
* Demo描述:
* 在一个类中有另外一个类的对象
* 比如此处的Worker类中有一个Student类的对象:
* private Student mStudent;
*
* 目前需求:
* 我们需要反射出Worker类中的 private Student mStudent
* 并且使用该对象调用其对应的方法
*/
public class MainActivity extends Activity {
private Field mStudentField;
private Object mStudentObject;
private Class mStudentClass;
private Method mStudentShowMethod; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
try { String workerClassName="cn.testreflect.Worker";
Class workerClass=Class.forName(workerClassName); //得到Worker类中的mStudent字段
mStudentField=workerClass.getDeclaredField("mStudent");
mStudentField.setAccessible(true);
//实例化mStudent对象
mStudentObject=mStudentField.get(new Worker());
//得到mStudent对象对应类的Class
mStudentClass = Class.forName(mStudentObject.getClass().getName());
//反射出该Class类中的show()方法
mStudentShowMethod = mStudentClass.getDeclaredMethod("show");
//取消访问私有方法的合法性检查
mStudentShowMethod.setAccessible(true);
//调用show()方法
mStudentShowMethod.invoke(mStudentObject); } catch (Exception e) {
System.out.println(e.toString());
} } }

Worker如下:

package cn.testreflect;

public class Worker {
private int age;
private String name;
private Student mStudent;
public Worker() {
super();
mStudent=new Student("I am a student", 9527);
System.out.println("---> public Worker(){ }");
}
public Worker(int age, String name) {
super();
this.age = age;
this.name = name;
mStudent=new Student("I am a student", 9527);
System.out.println("---> public Worker(int age, String name){ }");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Worker [age=" + age + ", name=" + name + "]";
} public void printMessage(String name,int age,int salary){
System.out.println("name="+name+",age="+age+",salary="+salary);
} }

Student如下:

package cn.testreflect;

public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
} public void show(){
System.out.println("-----> call method show()");
} }

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Android中Java反射技术的使用"
android:layout_centerInParent="true"/> </RelativeLayout>

最新文章

  1. 如何使用Microsoft技术栈
  2. linux 系统性能分析
  3. Windows动态库学习心得
  4. js中var 笔记
  5. RabbitMQ与AMQP协议详解
  6. WPF中禁止WebBrowser控件打开新窗口
  7. .net软件自动化测试笔记(API-2)
  8. (转)PHP中extract()函数的妙用
  9. Java中的一些术语的解释
  10. s5pv210 AD转换
  11. hearbeart
  12. CodeSmith生成实体类
  13. 读《Java并发编程的艺术》(二)
  14. SVN:Cleanup failed to process the following paths
  15. mysql主从复制笔记
  16. 在Spring Boot中使用数据库事务
  17. IdentityServer4 密码模式认证
  18. php面试题整理(一)
  19. python-中缀转换后缀并计算
  20. Html5与Css3知识点拾遗(三)

热门文章

  1. UVa 10791 Minimum Sum LCM【唯一分解定理】
  2. hihoCoder #1181: 欧拉路&#183;二 (输出路径)
  3. 20160130.CCPP体系详解(0009天)
  4. 每天一个Linux命令(1): find
  5. 六:分布式事务一致性协议paxos的分析
  6. MVC中如何跳过对模型中某个属性的验证
  7. Arduino运行时突然[卡死在某一行/立即重启/串口输出乱码/程序执行不正常]的可能原因
  8. PHP中最容易忘记的一些知识点总结
  9. 什么时候用copy什么时候用retain (一)
  10. C++中,申请字符串数组可用new实现