【Android應用開發】-(21)Android中巧用反射解決程序兼容性問題

    Android的更新速度太快,因爲她的開源,所以造就了一批技術公司,一堆的方案,從而各有特色。對於一個想要深入瞭解系統的開發者來說這是幸運的,但從一個產品角度來看,這是致命的。我們開發應用程序,爲了保證程序的兼容性,我們買了很多設備做兼容性測試,但往往不如人意。這裏不打算解決此問題,只是嘮叨下。本文只是介紹一個簡單的技巧來做兼容。

    背景:框架層的某個方法在新版本中添加了一個參數或者少了幾個參數,爲了程序的兼容性,必須要解決這個問題。否則將會多出很多個版本!這可怎麼辦呢?辦法是有的,使用Java中的反射技術! 這裏只寫了個簡單的演示程序。至於什麼是反射技術,反射怎麼用,請看這篇博文java反射詳解 - Rollen Holt - 博客園 

    很簡單,直接上代碼

public class Demo {

	public void setABC(int id,String name){
	}
	
	public void setDEF(int id,String name,String pwd){
		System.out.println("id="+id+",name="+name+";pwd="+pwd);
	}
}

package org.winplus.java;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		
	}
	
	/**
	 * 得到類中的所有方法
	 */
	private static void getAllMethods(){
		Class clz = Demo.class;
		Method[] method = clz.getDeclaredMethods();

		for (Method m : method) {
			Class retType = m.getReturnType();
			Class[] paramTypes = m.getParameterTypes();

			for (int j = 0; j < paramTypes.length; j++) {
				if (j > 0)
					System.out.print(" , "); 
				System.out.print(paramTypes[j].getName());
			}
		}
	}
	
	/**
	 * 得到指定的方法,並調用方法
	 */
	private static void  exeMethod(){
		Class clz = Demo.class;
		Class[] clzs = new Class[3];
		clzs[0] = int.class;
		clzs[1] = String.class;
		clzs[2] = String.class;
		try {
			Method mth  = clz.getDeclaredMethod("setDEF", clzs);
				mth.invoke(new Demo(), 12,"tang","haha");
			System.out.println(mth.getName());
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
}

原創文章,轉載請註明出處:http://blog.csdn.net/tangcheng_ok

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章