zoukankan      html  css  js  c++  java
  • 【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");
        }
        }
    
    
      
    }
  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/xubuhang/p/4872334.html
Copyright © 2011-2022 走看看