Android反射出一个类中的其他类对象并调用其对应方法
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>
Android反射出一个类中的其他类对象并调用其对应方法的更多相关文章
- [PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法
问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 c ...
- js中解析json对象:JSON.parse()用于从一个字符串中解析出json对象, JSON.stringify()用于从一个对象解析出字符串。
JSON.parse()用于从一个字符串中解析出json对象. var str = '{"name":"huangxiaojian","age&quo ...
- 简单练习题2编写Java应用程序。首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”、“取款”和“余额查询”。其次, 编写一个主类,在主类中测试Account类的功能
编写Java应用程序.首先定义一个描述银行账户的Account类,包括成员变 量“账号”和“存款余额”,成员方法有“存款”.“取款”和“余额查询”.其次, 编写一个主类,在主类中测试Account类的 ...
- 笔试题&面试题:找出一个数组中第m小的值并输出
题目:找出一个数组中第m小的值并输出. 代码: #include <stdio.h> int findm_min(int a[], int n, int m) //n代表数组长度,m代表找 ...
- ZT CSDN 如何以最快的速度计算出一个二进制数中1的个数? [
一道算法面试题:如何以最快的速度计算出一个二进制数中1的个数? [问题点数:10分,结帖人weicai_chen] 收藏 weicai_chen weicai_chen 等级: 结帖率:95.12% ...
- vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类
vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类 2011-10-20 12:00 486人阅读 评论(0) 收藏 举报 一.将类做成DLL 方法一: 你可以通过在命令行下用命令将以 ...
- 编写一个c函数,该函数给出一个字节中被置为1的位的个数
请编写一个c函数,该函数给出一个字节中被置为1的位的个数 #include <stdio.h> void fun(char ch) { int i; int temp; int count ...
- 转载:C++中两个类中互相包含对方对象的指针问题
原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...
- C#派生类中使用基类protected成员的方法
我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被prot ...
随机推荐
- UIPikerView
UIPikerView的属性 1. numberOfComponents:返回UIPickerView当前的列数 NSInteger num = _pickerView.numberOfCompo ...
- BZOJ 1123 BLO
tarjan求割点计算答案.注意不是每一棵子树都算答案.开个变量记一下. #include<iostream> #include<cstdio> #include<cst ...
- IOS中设置cell的背景view和选中时的背景view 、设置cell最右边的指示器(比如箭头\文本标签)
一.Cell的设置 1.设置cell的背景view和选中时的背景view UIImageView *bg = [[UIImageView alloc] init]; bg.image = [UIIma ...
- [反汇编练习] 160个CrackMe之025
[反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- 整理一些js中常见的问题
原文链接 1.js获取select标签选中的值 原生js var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = ...
- php 在函数内引用全局变量 讲解引用
<?php $var1 = "Example variable"; $var2 = ""; function global_references($use ...
- eclipse 报错 import ... cannot be resolved 处理方法
项目上右键,properties, 找java build path,切到libraies标签,将爆红的jdk编辑一下,选用你需要的jdk版本,一般1..我看你类的httpServlet报错,也是这个 ...
- 手机GUI自动化测试介绍
手机GUI自动化测试介绍 Posted on 2013/05/15 Xing Binbin(测试工程师) 摘要 众所周知,自动化测试可以一定程度上减轻测试人员负担,提高测试效率,并且通过自动化还可以实 ...
- Android手机部分名词浅谈
1.什么是Radio? Radio是无线通信模块的驱动程序,ROM是系统程序,radio负责网络通信,ROM和Radio可以分开刷,互不影响.如果您的手机刷新了ROM后有通讯方面的问题可以刷新radi ...
- ADG打补丁
1 产品DG备库安装 16494615 补丁 主库停止向备库传输日志 alter system set log_archive_dest_state_2=defer; alter system set ...