Android反射出一个类中的其他类对象并调用其对应方法
2024-09-20 21:01:18
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>
最新文章
- 如何使用Microsoft技术栈
- linux 系统性能分析
- Windows动态库学习心得
- js中var 笔记
- RabbitMQ与AMQP协议详解
- WPF中禁止WebBrowser控件打开新窗口
- .net软件自动化测试笔记(API-2)
- (转)PHP中extract()函数的妙用
- Java中的一些术语的解释
- s5pv210 AD转换
- hearbeart
- CodeSmith生成实体类
- 读《Java并发编程的艺术》(二)
- SVN:Cleanup failed to process the following paths
- mysql主从复制笔记
- 在Spring Boot中使用数据库事务
- IdentityServer4 密码模式认证
- php面试题整理(一)
- python-中缀转换后缀并计算
- Html5与Css3知识点拾遗(三)
热门文章
- UVa 10791 Minimum Sum LCM【唯一分解定理】
- hihoCoder #1181: 欧拉路&#183;二 (输出路径)
- 20160130.CCPP体系详解(0009天)
- 每天一个Linux命令(1): find
- 六:分布式事务一致性协议paxos的分析
- MVC中如何跳过对模型中某个属性的验证
- Arduino运行时突然[卡死在某一行/立即重启/串口输出乱码/程序执行不正常]的可能原因
- PHP中最容易忘记的一些知识点总结
- 什么时候用copy什么时候用retain (一)
- C++中,申请字符串数组可用new实现