【Android】反射

package com.example.myandroidtest;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

import android.R.integer;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends BaseActivity {
     Class<?> bclazz;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("tag", "=MainActivity=onCreate=");
        try{
            //獲取指定類的class對象
            Class<?> clazz = Class.forName("android.app.Notification");
            //clazz.newInstance();
            //得到全部構造函數
            Constructor[] constructors=clazz.getConstructors();
            for (Constructor constructor : constructors) {
                Log.e("Constructor反射構造函數:","");
                    //取出第i個構造方法。
                System.out.print(Modifier.toString(constructor.getModifiers()));
                //---- 打印該構造方法的前綴修飾符
                System.out.print(" "+constructor.getName()+"("); //打印該構造方法的名字
                //---- 打印該構造方法的參數。
                Class[] parameterTypes=constructor.getParameterTypes(); //構造方法參數集可是 數組類型顯示特殊
                for(int j=0;j<parameterTypes.length;j++) 
                {
                    System.out.print(parameterTypes[j].getName());
                }
                System.out.println(")");
            }
            //修飾符 -類名 -超類名 -接口
            Log.e("Notification反射包名", Modifier.toString(clazz.getModifiers())+" "
              +clazz.getPackage().getName()+" extends "+clazz.getSuperclass()+" implement "+clazz.getInterfaces().getClass().getName());
            //全部字段
            Field[] fields=clazz.getDeclaredFields();
            //全部public字段
            //Field[] fields=clazz.getFields();
            for(Field field : fields)
            {   //數組特殊處理
                if (field.getType().isArray()) {
                    Log.e("Notification反射屬性", field.getType().getComponentType()+" "+field.getName());
                } else {
                    Log.e("Notification反射屬性", field.getType()+" "+field.getName());
                }
            }
            //全部方法
           Method[] methods =clazz.getDeclaredMethods();
           //全部public方法
           //Method[] methods =clazz.getMethods();

           for(Method method : methods)
           {
               Log.e("Notification method反射name", Modifier.toString(method.getModifiers())+" "+method.getName());
             
           }
           
        }catch (Exception e){
            e.printStackTrace();
            Log.e("Notification反射錯誤", "Exception");
        }
    
    try{
        //得到指定包的Context對象
        Context c = createPackageContext("com.example.myandroidtest", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
        //得到class對象
        bclazz = Class.forName("android.bluetooth.BluetoothManager");
        //全部構造函數
        Constructor[] constructors=bclazz.getDeclaredConstructors();
        //全部public構造函數
        //Constructor[] constructors=bclazz.getConstructors();
        for (Constructor constructor : constructors) {
            Log.e("Constructor反射構造函數:","");
             //取出第i個構造方法。
            System.out.print(Modifier.toString(constructor.getModifiers()));
            //---- 打印該構造方法的前綴修飾符
            System.out.print(" "+constructor.getName()+"("); //打印該構造方法的名字
            //---- 打印該構造方法的參數。
            Class[] parameterTypes=constructor.getParameterTypes(); //構造方法參數集可是 數組類型顯示特殊

            for(int j=0;j<parameterTypes.length;j++) 
            {
            System.out.print(parameterTypes[j].getName());
            }
            System.out.println(")");
            //constructor.newInstance(c);//實例化
        }
        //有參數構造函數
        Constructor con = bclazz.getConstructor(Context.class);
        //建立它的一個對象
        //Object maObject = bclazz.newInstance();//構造函數無參數實例化     
        Log.e("calzz 是否爲Null", ""+(bclazz==null));
        Log.e("BluetoothManager反射包名", Modifier.toString(bclazz.getModifiers())+" "
                +bclazz.getPackage().getName()+" extends "+bclazz.getSuperclass()+" implement "+bclazz.getInterfaces().getClass().getName());
        //全部字段
        Field[] fields=bclazz.getDeclaredFields();
        for(Field field : fields)
        {
            if (field.getType().isArray()) {
                Log.e("BluetoothManager反射屬性", field.getType().getComponentType()+" "+field.getName());
            } else {
                Log.e("BluetoothManager反射屬性", field.getType()+" "+field.getName());
            }
            
        }
        
       //得到全部方法
       Method[] methods =bclazz.getDeclaredMethods();
       for(Method method : methods)
       {
           Log.e("BluetoothManager method反射name", ""+method.getName());
           if (method.getName().equals("getAdapter")) {
               //執行方法
               method.invoke(con.newInstance(c));
        }
       }   
    }catch (Exception e){
        e.printStackTrace();
        Log.e("calzz 是否爲Null", ""+(bclazz==null));
        Log.e("BluetoothManager反射錯誤", "Exception");
    }
    }


  
}
相關文章
相關標籤/搜索