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 ...
随机推荐
- IOS中字符串操作
1.比较大小 - (NSComparisonResult)compare:(NSString *)string; 返回值NSComparisonResult有3种情况: NSOrderedAscend ...
- Javascript模块化编程(三):require.js的用法 (转)
转自:http://my.oschina.net/u/1390066/blog/213769 一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载 ...
- DOMContentLoaded事件
今天查看百度空间源代码,发现多了个util.js文件,打开看看.里面里面定义了addDOMLoadEvent.这是干什么用的? 仔细查看代码,发现在Mozilla添加了DOMContentLoaded ...
- cppunit使用详解
cppunit使用详解 第一步:如何安装 (我的运行环境: fc7 Linux, gcc4) cppunit 的安装是相当标准的linux的安装过程 a. 下载cppunit的源文件 ...
- 带删除小图标的EditText
import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawa ...
- Android百度地图开发(二)地图覆盖物
上一篇文章写道如何在一个mapview中简单的显示地图:本次学习一下如何在地图上添加一些覆盖物. 1.设置显示交通地图: // 显示交通地图 mapView.setTraffic(true); 2.设 ...
- linux 为开机菜单加密码·
首先是在/boot/grub/menu.lst 里面添加密码的,但是需要是加密过后的,否则人家直接跑到你的menu.lst里面查看密码不就行了.... 于是,可以使用grub提供的md5加密功能: # ...
- matlab 调用VLfeat库开篇问题
准备工作见此网站 :http://cnyubin.com/?p=85 保存关闭startup.m文件后 重新打开matlab后 在命令行输入path或者vl_version无法检测到库已安装到matl ...
- 修改docker的默认存储位置
service docker stop mv /var/lib/docker /mnt/docker ln -s /mnt/docker /var/lib/docker ls /var/lib/doc ...
- linux安装lua相关编译报错
1.报之类的错误 /usr/lib/libreadline.so: undefined reference to `PC' /usr/lib/libreadline.so: undefined ref ...