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>


 

相关文章
|
6月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
219 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
10月前
|
Android开发 开发者
Android自定义view之利用drawArc方法实现动态效果
本文介绍了如何通过Android自定义View实现动态效果,重点使用`drawArc`方法完成圆弧动画。首先通过`onSizeChanged`进行测量,初始化画笔属性,设置圆弧相关参数。核心思路是不断改变圆弧扫过角度`sweepAngle`,并调用`invalidate()`刷新View以实现动态旋转效果。最后附上完整代码与效果图,帮助开发者快速理解并实践这一动画实现方式。
239 0
|
8月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
541 11
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
704 15
Android 系统缓存扫描与清理方法分析
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
470 1
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
366 2
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
406 2
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
549 0
|
Android开发
Android中调用隐藏类中的方法
终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 在写Android的时候,有些类是隐藏类,因而无法直接调用,比如AnimatedRotateDrawable这个类,该类类名上有@hide标注,表明该类是一个隐藏类。
1260 0
|
5月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
864 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡