Android中Java反射技术的使用示例

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

MainActivity如下:

package cn.testreflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.os.Bundle;
import android.app.Activity;
/**
 * Demo描述:
 * Android中Java反射技术的使用示例
 * 在Java中描述字节码文件(xxx.class)的类叫Class
 * 反射的过程可视为剖析Class的过程
 */
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
    private void init(){
    	try {
    		/**
    		 * 1 反射出无参的构造方法并得到对象
    		 * 注意:
    		 *      1 在Class.forName()中应该传入含有包名的类全名
    		 *      2 newInstance()方法的本质是调用类的无参Public构造方法
    		 */
    		String className1="cn.testreflect.Worker";
        	Class clazz1=Class.forName(className1);
        	Object object1=clazz1.newInstance();
        	System.out.println("object1.toString()="+object1.toString());
        	
        	/**
        	 * 2 反射出带参数的构造方法并得到对象
        	 */
        	String className2="cn.testreflect.Worker";
        	Class clazz2=Class.forName(className2);
        	Constructor constructor1=clazz2.getConstructor(int.class,String.class);
        	Object object2=constructor1.newInstance(18,"小明");
        	System.out.println("object2.toString()="+object2.toString());
        	
        	/**
        	 * 3 获取类的私有字段
        	 * 注意:
        	 *      获取共有字段应调用clazz3.getField(name)方法
        	 */
        	String className3="cn.testreflect.Worker";
        	Class clazz3=Class.forName(className3);
        	Field ageField1=clazz3.getDeclaredField("age");
        	System.out.println("ageField1="+ageField1);
        	
        	/**
        	 * 4 获取和更改某个对象的私有字段
        	 *   即模拟get()和set()方法
        	 */
        	String className4="cn.testreflect.Worker";
        	Class clazz4=Class.forName(className4);
        	Field ageField2=clazz4.getDeclaredField("age");
        	Object object4=constructor1.newInstance(18,"小明");
        	//取消访问私有字段的合法性检查
        	ageField2.setAccessible(true);
        	//获取对象的私有字段
        	Object ageObject4=ageField2.get(object4);
        	System.out.println("ageObject4="+ageObject4);
        	
        	//再更改对象的私有字段的值
        	ageField2.set(object4, 9527);
        	//重新获得
        	Object ageObject5=ageField2.get(object4);
        	System.out.println("ageObject5="+ageObject5);
        	
        	/**
        	 * 5 调用对象的带参数的方法
        	 */
        	String className5="cn.testreflect.Worker";
        	Class clazz5=Class.forName(className5);
        	Method method=clazz5.getMethod("printMessage", String.class,int.class,int.class);
        	Object object5=clazz5.newInstance();
        	method.invoke(object5, "周星星",50,9527);
        	
        	
		} catch (Exception e) {
			System.out.println(e.toString());
		}
    
    }

}


Worker如下:

package cn.testreflect;

public class Worker {
    private int age;
    private String name;
    public Worker() {
		super();
		System.out.println("---> public Worker(){ }");
	}
	public Worker(int age, String name) {
		super();
		this.age = age;
		this.name = name;
		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);
	}
    
}

 

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>


 

相关文章
|
18天前
|
NoSQL Java 数据库连接
深入探索 Java 后台开发的核心技术
【4月更文挑战第5天】本文探讨了Java后台开发的关键技术,包括Spring框架与Spring Boot的使用,MyBatis和Hibernate的ORM选择,关系型与NoSQL数据库的适用场景,线程池与异步处理在并发中的作用,微服务架构及RESTful API设计。这些核心技术有助于开发者打造稳定、高性能的Java后台系统,适应不断发展的云计算和人工智能需求。
|
20天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
1月前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
25天前
|
存储 SQL Java
【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了(二)
【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了
42 1
|
27天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
25天前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
67 0
|
5天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
6天前
|
存储 数据可视化 安全
Java全套智慧校园系统源码springboot+elmentui +Quartz可视化校园管理平台系统源码 建设智慧校园的5大关键技术
智慧校园指的是以物联网为基础的智慧化的校园工作、学习和生活一体化环境,这个一体化环境以各种应用服务系统为载体,将教学、科研、管理和校园生活进行充分融合。无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、丰富多彩的校园文化、方便周到的校园生活。简而言之,“要做一个安全、稳定、环保、节能的校园。
26 6
|
7天前
|
监控 前端开发 算法
Java技术体系
Java技术体系(韩顺平老师整理)
9 0
|
17天前
|
存储 安全 Java
Java中实现高效的字符串拼接技术
【4月更文挑战第6天】在Java编程中,字符串拼接是一个常见的操作。然而,由于字符串的不可变性,频繁的拼接操作可能会导致性能问题。本文将探讨Java中实现高效字符串拼接的技术,包括使用StringBuilder类、StringBuffer类以及Java 8中的StringJoiner类。通过对比这些技术的优缺点,我们将为您提供在不同场景下选择合适的字符串拼接方法的建议。