java反射机制的使用

本文介绍了一个简单的Android项目,演示如何使用反射机制加载图片资源及访问类的私有成员。通过MainActivity和Program两个类的示例代码,展示了反射的基本用法,并讨论了在不同情况下反射的应用。
摘要由CSDN通过智能技术生成

一个android项目demo,越简单的项目越不容易出错,这是肯定的。

activity_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"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <ImageView 
        android:id="@+id/img1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        
        />

</RelativeLayout>


MainActivity.java

package com.Harris.reflectdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView iv;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv = (ImageView) findViewById(R.id.img1);
		iv.setImageResource(getId());
		
	}
	//声明静态方法,可以直接调用。此外还需要手动写Try Catch循环,不然会报错
	//亲自试验了一下,先在res下面建一个drawable文件夹,里面放上d1.png。没问题
	//删除res文件夹,在drawable_hdpi;里面放上d1.png,依旧没问题
	public static int getId(){
		Class cl = R.drawable.class;
		int id = 0;
		try{
			//getDecalredField应该就是获取了这个类下面的Object,然后通过getInt(null)获得int类型Id。
			id = cl.getDeclaredField("d1").getInt(null);}
		catch(Exception e){
			e.printStackTrace();
		}
		return id;
	}
	
	
}

从网上下载了一个项目的时候需要用到反射,现会用再说,今后有什么新的再补充。

重新找到了一个介绍反射的例子http://my.oschina.net/swords/blog/117357

自己尝试着新建一个java项目

import java.lang.reflect.Field;


public class Program{
	
	
	public Program() {
		super();
	}
	
	public Program(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	private String name = "sss" ;
	private int age = 11;
	
	//故意设置为private的方法
	
	private String getName(String name){
		
		return this.name;
	}
	
	public static void main(String[] args ) throws NoSuchFieldException, SecurityException{
		
		try {
			Program program = new Program();
			Class proClass = program.getClass();
			Field proField = proClass.getDeclaredField("name");
			//打印这个变量的名称
			System.out.println(proField.toString());
			//获得这个变量的具体值并打印
			String str = proField.getName();
			System.out.println(str);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}		
}

打印结果是

private java.lang.String Program.name
name

为什么不能打印出sss呢?

还是不能获得变量的具体数值

下面继续改,貌似获得field的引用是没有问题的,但是获得field对应的值只能通过在Program这个类里面添加一个自定义的方法返回age具体数值,

然后经由这个field的引用调用这个方法来获得数值,就是这样。

import java.lang.reflect.Field;

public class Program{
	private String name = "xxx";
	private int age = 11;
	public Program() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Program(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public int getAge(){
		return age;
	}
	public static void main(String[] args) throws NoSuchFieldException, SecurityException{
		
		try {
			Program myprogram  = new Program();
			Class myclass = myprogram.getClass();
			System.out.println(myclass);
			Field ageField = myclass.getDeclaredField("age");
			System.out.println(ageField);
			ageField.set(myprogram, 22);
			System.out.println(myprogram.getAge());
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		
	}
	
	
	
	
	
	
	
}

参考文章:

http://www.cnblogs.com/penghongwei/p/3300084.html

http://my.oschina.net/swords/blog/117357



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值