一个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>
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