【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");
    }
    }

}
时间: 2024-10-16 05:20:45

【Android】反射的相关文章

Android反射机制实现与原理

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中

38. Android 反射资源工具ReflectionUtil

38. Android 反射资源工具ReflectionUtil Android 反射资源工具ReflectionUtil 工具代码 工具使用 工具代码 ReflectionUtil public class ReflectionUtil { public enum ResourcesType { styleable, style, string, mipmap, menu, layout, integer, id, drawable, dimen, color, bool, attr, ani

Android 反射调用资源和id

本文介绍利用反射调用资源和id 提出问题: app有一种叫应用墙的广告,应用墙是在你的程序中弹出一个Activity来展示广告,比如豌豆广点通等,集成的时候需要将资源通过复制添加到自己的项目中,但是app墙的代码是封装好的jar代码.不是源码,看不到,也不能修改.那么jar中的代码是如何加载本地资源的呢? 自己的项目中加载资源的时候都是通过本项目的R文件来初始化资源,R文件是你自己的项目的R文件,和项目有关,如果第三方的jar文件中使用的R是来第三方SDK项目中的资源R,代码更换了项目之后铁定了

Android反射机制技术的使用示例

转:http://blog.csdn.net/lfdfhl/article/details/10311505 1 package com.nthm.androidtestActivity; 2 3 import java.io.File; 4 import java.lang.reflect.Constructor; 5 import java.lang.reflect.Field; 6 import java.lang.reflect.Method; 7 import com.nthm.and

android 反射方式 实现接、挂电话

1.  在工程中导入ITelephony.aidl文件 /* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of

Android反射打造万能SharedPreferences

1.将我们想要保存的数据封装成一个实体类 Person.java 其中属性我们都用Public来修饰 public class Person { //String类型属性 姓名 public String name; //int类型属性 年龄 public int age; //float类型属性 身高 public float height; //boolean类型属性 是否已婚 public boolean isMarried; //String类型属性 证件号 public String

android反射组件 (一个)java 它们的定义annotation基础知识

它们的定义annotation它由三部分组成: 它们的定义annotation.使用annotation班.annotation的处理方法. 一.自己定义annotation  元注解包含下面: 1)@Target    描写叙述注解使用的范围 取值包含: 1.CONSTRUCTOR:用于描写叙述构造器 2.FIELD:用于描写叙述域 3.LOCAL_VARIABLE:用于描写叙述局部变量 4.METHOD:用于描写叙述方法 5.PACKAGE:用于描写叙述包 6.PARAMETER:用于描写叙

android反射组件 (一)java 自定义annotation基础知识

自定义annotation包括三部分: 自定义annotation.使用annotation的类.annotation的处理方法. 一.自定义annotation  元注解包括以下: 1)@Target    描述注解使用的范围 取值包括: 1.CONSTRUCTOR:用于描述构造器 2.FIELD:用于描述域 3.LOCAL_VARIABLE:用于描述局部变量 4.METHOD:用于描述方法 5.PACKAGE:用于描述包 6.PARAMETER:用于描述参数 7.TYPE:用于描述类.接口(

android中反射机制

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中

Java反射机制的原理及在Android下的简单应用

花了几天时间,研究了一下Java的反射机制.在这里总结一下这几天学习的成果,一来分享自己的学习过程和在学习中遇到的问题,二来是给像我一样不太了解Java反射机制的同学做一个简单的介绍.在文章后面会链接一个Android反射机制的应用程序. 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述