java反射机制的使用

来源:互联网 发布:企业网络性能需求 编辑:程序博客网 时间:2024/05/22 05:20

一个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;@Overrideprotected 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 blocke.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 blocke.printStackTrace();}}}

参考文章:

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

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



0 0
原创粉丝点击