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>


 

相关文章
|
1月前
|
Android开发
Android 分享机顶盒项目的封装类《GridView》(二)(转)
Android 分享机顶盒项目的封装类《GridView》(二)(转)
24 2
|
1月前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
160 0
|
15天前
|
安全 Android开发 Kotlin
Android面试题之Kotlin的几种常见的类
这篇文章探讨了Kotlin编程语言中的初始化顺序、延迟初始化、惰性初始化、`lateinit`与`by lazy`的区别、初始化注意事项、继承、嵌套类、数据类、单例类和枚举类的使用,以及密封类的概念。文中通过示例代码详细解释了各种特性,并提醒读者关注初始化顺序和线程安全问题。同时,鼓励读者关注作者的公众号“AntDream”获取更多相关文章。
18 1
|
21天前
|
存储 Java Android开发
Android上在两个Activity之间传递Bitmap对象
Android上在两个Activity之间传递Bitmap对象
16 2
|
18小时前
|
Java Android开发
程序与技术分享:Android使用Dagger注入的方式初始化对象的简单使用
程序与技术分享:Android使用Dagger注入的方式初始化对象的简单使用
|
6天前
|
缓存 大数据 Android开发
Android 巧用putBinder方法传递大文件
Android 巧用putBinder方法传递大文件
14 0
|
1月前
|
Android开发
【通讯录教程】苹果安卓鸿蒙系统通用,如何大批量导入手机号码到手机的通讯录,下面教你方法,只需1分钟搞定几万个号码的导入手机电话本
该文介绍了一种快速批量导入手机通讯录的方法,适用于处理大量手机号的需求,如微商管理、客户资料整理等。在QQ同步助手开始收费后,提供了免费的替代方案。步骤包括:下载批量导入软件(链接提供腾讯云盘和百度网盘地址),清空通讯录(非必需),制作符合格式的通讯录文件,并按操作系统(苹果、安卓或鸿蒙)进行导入。整个过程只需1分钟,简便快捷。
|
1月前
|
Android开发
Android获取蓝牙设备列表的方法
Android获取蓝牙设备列表的方法
69 5
|
1月前
|
Android开发
Android获取当前系统日期和时间的三种方法
Android获取当前系统日期和时间的三种方法
43 4
|
1月前
|
API 开发工具 Android开发
调用Android原生@SystemApi、@Hide方法
调用Android原生@SystemApi、@Hide方法
57 1