Android反射出一个类中的其他类对象并调用其对应方法

简介: MainActivity如下: package cn.testreflect;import java.lang.reflect.Field;import java.

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>


 

相关文章
|
3月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
150 2
|
12天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
39 15
Android 系统缓存扫描与清理方法分析
|
24天前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
17 1
|
5天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
10 0
|
1月前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
19 2
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
43 2
|
3月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
176 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
378 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82