IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Java 反射 -> 正文阅读

[移动开发]Java 反射

一、根据一个字符串得到一个类

1、getClass

  String a = "22222";
  Class aClass = a.getClass();  //输出aClass:class java.lang.String

2、Class. forName()

 try {
       Class c1 = Class.forName("java.lang.String"); //class java.lang.String
       Class c2 = Class.forName("android.webkit.WebView");//class android.webkit.WebView
       Class c3 = c2.getSuperclass();// class android.widget.AbsoluteLayout

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

3、class属性

 //每一个类都有class属性,可以得到这个类的类型
        Class c4 = String.class; // class java.lang.String
        Class c5 = int.class; // int
        Class c6 = android.app.Activity.class; //class android.app.Activity

4、TYPE属性

 // 基本数据类型都有TYPE属性
 //基本数据类型 Boolean、String、Char、Byte、Integer、Float、Double、Short
        Class c7 = Boolean.TYPE;//boolean
        Class c8 = Void.TYPE;//void

二、获取类成员

测试类TestClassCtor:


/**
 *  用于测试的测试类
 */
public class TestClassCtor {
    public static final String TAG = TestClassCtor.class.getSimpleName();

    /**
     * 测试无参的构造方法
     */
    public TestClassCtor() {
    }

    /**
     * 测试带参数的公有构造方法
     * @param a
     */
    public TestClassCtor(int a){

    }

    /**
     * 测试带参数的私有构造方法
     * @param a
     * @param b
     */
     private TestClassCtor(int a,String b){
         Log.e(TAG," b->"+ b);

     }

    /**
     * 测试私有方法
     * @param d
     * @return
     */
     private String doSomething(String d){
        return "123"+d;
     }
}

1、获取类的构造函数

//1、获取所有构造函数
        TestClassCtor testClassCtor = new TestClassCtor();
        Class testClassCtorClass = testClassCtor.getClass();
        String name = testClassCtorClass.getName();

        //获取所有的构造函数
        Constructor[] declaredConstructors = testClassCtorClass.getDeclaredConstructors();
        for (int i = 0; i < declaredConstructors.length; i++) {
            int modifiers = declaredConstructors[i].getModifiers();
            Log.e(TAG,"构造函数名称:"+ name + "构造函数作用域:"+ Modifier.toString(modifiers));

            //获取每个构造函数的参数
            Class[] parameterTypes = declaredConstructors[i].getParameterTypes();
            for (int j = 0; j < parameterTypes.length; j++) {
                String paraName = parameterTypes[j].getName();
                Log.e(TAG,"参数名称:"+ paraName);
            }
        }

输出结果:

在这里插入图片描述
分别打印了无参的公有构造函数,有一个int类型参数的公有构造函数,有一个int类型,一个String类型的私有构造函数。

2、获取类的某一个构造函数

 try {
            //  获取有一个参数的构造方法 ,类型为int
            Class[] c1 = {int.class};
            Constructor declaredConstructor = testClassCtorClass.getDeclaredConstructor(c1);
            Log.e(TAG,"获取到的构造方法名称:"+declaredConstructor.getName());
            Log.e(TAG,"获取到的构造方法作用域:"+Modifier.toString(declaredConstructor.getModifiers()));

            //获取有两个参数的构造方法
            Class[]  c2 = {int.class,String.class};
            Constructor declaredConstructor1 = testClassCtorClass.getDeclaredConstructor(c2);
            Log.e(TAG,"获取到的构造方法名称:"+declaredConstructor1.getName());
            Log.e(TAG,"获取到的构造方法作用域:"+Modifier.toString(declaredConstructor1.getModifiers()));

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

在这里插入图片描述

3、调用构造函数

  try {
            Class  getTestClass = Class.forName("com.cdv.reflectdemo.TestClassCtor");
            //含有参数
            Class[] c2 = {int.class,String.class};
            Constructor declaredConstructor = getTestClass.getDeclaredConstructor(c2);
            Object newInstance = declaredConstructor.newInstance(1, "3");

            //无参
            Constructor declaredConstructor1 = getTestClass.getDeclaredConstructor();
            Object newInstance1 = declaredConstructor.newInstance();
            
            //如果构造函数是无参的
            Object newInstance2 = getTestClass.newInstance();
        } catch (ClassNotFoundException | NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

4、获取类的私有方法并调用它

try {
            // 调用一个私有方法
            TestClassCtor getTestClass = new TestClassCtor();
            Method doSomething = getTestClass.getClass().getDeclaredMethod("doSomething", String.class);
            doSomething.setAccessible(true);
            doSomething.invoke(getTestClass,"hello");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

5、获取类的静态私有方法并调用

try {
            Class getTestClass = Class.forName("com.cdv.reflectdemo.TestClassCtor");
            Method testStaticMethod = getTestClass.getDeclaredMethod("testStaticMethod");
            testStaticMethod.setAccessible(true);
            testStaticMethod.invoke(null);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

6、获取类的私有字段并修改

try {
            TestClassCtor getTestClass = new TestClassCtor();
            Field testPrivateField = getTestClass.getClass().getDeclaredField("testPrivateField");
            testPrivateField.setAccessible(true);
            testPrivateField.set(getTestClass,"ceshishuju");

            Log.e(TAG,"获取到的testPrivateField:"+ getTestClass.getTestPrivateField());
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }

在这里插入图片描述

7、获取类的静态私有字段并修改

try {
//获取到静态私有属性
            TestClassCtor getTestClass = new TestClassCtor();
            Field testStaticPrivateFiled = getTestClass.getClass().getDeclaredField("testStaticPrivateFiled");
            testStaticPrivateFiled.setAccessible(true);
            testStaticPrivateFiled.set(getTestClass,"hahahah");
//调用静态私有属性的Get方法
            Method getTestStaticPrivateFiled = getTestClass.getClass().getDeclaredMethod("getTestStaticPrivateFiled");
            getTestStaticPrivateFiled.setAccessible(true);
            Object invoke = getTestStaticPrivateFiled.invoke(null);
            Log.e(TAG,"获取到的testStaticPrivateFiled:"+ invoke.toString());
        } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
            e.printStackTrace();
        }

在这里插入图片描述

三、对泛型反射

Singleton类


/**
 *  对泛型进行反射
 * @param <T>
 */
public abstract class Singleton<T> {

    private T mInstance;

    protected abstract T mInstance();

    public  final T getmInstance(){
       synchronized (this){
           if(mInstance == null){
               mInstance = mInstance();
           }
           return mInstance;
       }
    }

}

try {
            Class aClass = Class.forName("com.cdv.reflectdemo.Singleton");
            Method mInstance = aClass.getDeclaredMethod("mInstance");
            mInstance.setAccessible(true);
        } catch (ClassNotFoundException | NoSuchMethodException e) {
            e.printStackTrace();
        }

四、封装工具类

4.1、工具类的封装


public class RefInvoke {

    /**
     * 无参
     *
     * @param className 类的名称
     * @return 类的实例
     */
    public static Object createObject(String className) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        try {
            Class r = Class.forName(className);
            return createObject(r, pareTyples, pareVaules);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 无参
     *
     * @param clazz 类的实例
     * @return 类的实例
     */
    public static Object createObject(Class clazz) {
        Class[] pareTyple = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return createObject(clazz, pareTyple, pareVaules);
    }

    /**
     * 一个参数
     *
     * @param className 类的名称
     * @param pareTyple 参数类型
     * @param pareVaule 参数值
     * @return 类的实例
     */
    public static Object createObject(String className, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = new Class[]{pareTyple};
        Object[] pareVaules = new Object[]{pareVaule};

        try {
            Class r = Class.forName(className);
            return createObject(r, pareTyples, pareVaules);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 一个参数
     *
     * @param clazz     类的实例
     * @param pareTyple 参数类型
     * @param pareVaule 参数值
     * @return 类的实例
     */
    public static Object createObject(Class clazz, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = new Class[]{pareTyple};
        Object[] pareVaules = new Object[]{pareVaule};

        return createObject(clazz, pareTyples, pareVaules);
    }

    /**
     * 多个参数
     *
     * @param className  类的名称
     * @param pareTyples 参数类型
     * @param pareVaules 参数值
     * @return 类的实例
     */
    public static Object createObject(String className, Class[] pareTyples, Object[] pareVaules) {
        try {
            Class r = Class.forName(className);
            return createObject(r, pareTyples, pareVaules);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 多个参数
     *
     * @param clazz      类的实例
     * @param pareTyples 参数类型
     * @param pareVaules 参数值
     * @return 类的实例
     */
    public static Object createObject(Class clazz, Class[] pareTyples, Object[] pareVaules) {
        try {
            Constructor ctor = clazz.getDeclaredConstructor(pareTyples);
            ctor.setAccessible(true);
            return ctor.newInstance(pareVaules);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }


    /**
     * 调用实例方法
     *
     * @param obj        类的实例
     * @param methodName 方法名称
     * @param pareTyples 参数类型
     * @param pareVaules 参数值
     * @return 如果方法有返回值, 返回反射调用后的返回值,如果是void 返回 null
     */
    public static Object invokeInstanceMethod(Object obj, String methodName, Class[] pareTyples, Object[] pareVaules) {
        if (obj == null) {
            return null;
        }
        try {
            //调用一个private方法
            Method method = obj.getClass().getDeclaredMethod(methodName, pareTyples); //在指定类中获取指定的方法
            method.setAccessible(true);
            return method.invoke(obj, pareVaules);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 调用实例一个参数的方法
     *
     * @param obj        类的实例
     * @param methodName 方法名称
     * @param pareTyple  方法类型
     * @param pareVaule  方法值
     * @return 如果方法有返回值, 返回反射调用后的返回值,如果是void 返回 null
     */
    public static Object invokeInstanceMethod(Object obj, String methodName, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = {pareTyple};
        Object[] pareVaules = {pareVaule};

        return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
    }

    /**
     * 调用无参的方法
     *
     * @param obj        类的实例
     * @param methodName 方法名称
     * @return 如果方法有返回值, 返回反射调用后的返回值,如果是void 返回 null
     */
    public static Object invokeInstanceMethod(Object obj, String methodName) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return invokeInstanceMethod(obj, methodName, pareTyples, pareVaules);
    }


    /**
     * 调用无参数的静态方法
     *
     * @param className   类的名称
     * @param method_name 方法名称
     * @return 方法返回值  如果是void  返回null
     */
    public static Object invokeStaticMethod(String className, String method_name) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
    }

    /**
     * 有一个参数的静态方法
     *
     * @param className  类的名称
     * @param method_name  方法名称
     * @param pareTyple  参数类型
     * @param pareVaule  参数值
     * @return 方法返回值  如果是void  返回null
     */
    public static Object invokeStaticMethod(String className, String method_name, Class pareTyple, Object pareVaule) {
        Class[] pareTyples = new Class[]{pareTyple};
        Object[] pareVaules = new Object[]{pareVaule};

        return invokeStaticMethod(className, method_name, pareTyples, pareVaules);
    }

    /**
     * 多个参数的静态方法
     *
     * @param className  类的名称
     * @param method_name  方法名称
     * @param pareTyples  参数类型
     * @param pareVaules  参数值
     * @return 方法返回值  如果是void  返回null
     */
    public static Object invokeStaticMethod(String className, String method_name, Class[] pareTyples, Object[] pareVaules) {
        try {
            Class obj_class = Class.forName(className);
            return invokeStaticMethod(obj_class, method_name, pareTyples, pareVaules);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 无参静态方法
     * @param clazz  类的实例
     * @param method_name  方法名称
     * @return 方法返回值  如果是void  返回null
     */
    public static Object invokeStaticMethod(Class clazz, String method_name) {
        Class[] pareTyples = new Class[]{};
        Object[] pareVaules = new Object[]{};

        return invokeStaticMethod(clazz, method_name, pareTyples, pareVaules);
    }

    /**
     * 一个参数
     * @param clazz  类的实例
     * @param method_name  方法名称
     * @param classType  参数类型
     * @param pareVaule  参数值
     * @return 方法返回值  如果是void  返回null
     */
    public static Object invokeStaticMethod(Class clazz, String method_name, Class classType, Object pareVaule) {
        Class[] classTypes = new Class[]{classType};
        Object[] pareVaules = new Object[]{pareVaule};

        return invokeStaticMethod(clazz, method_name, classTypes, pareVaules);
    }

    /**
     * 多个参数
     * @param clazz  类的实例
     * @param method_name  方法名称
     * @param pareTyples 参数类型
     * @param pareVaules  参数值
     * @return 方法返回值  如果是void  返回null
     */
    public static Object invokeStaticMethod(Class clazz, String method_name, Class[] pareTyples, Object[] pareVaules) {
        try {
            Method method = clazz.getDeclaredMethod(method_name, pareTyples);
            method.setAccessible(true);
            return method.invoke(null, pareVaules);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取属性的值
     * @param obj  类的实例
     * @param filedName  属性名称
     * @return 属性的值
     */
    public static Object getFieldObject(Object obj, String filedName) {
        return getFieldObject(obj.getClass(), obj, filedName);
    }

    /**
     * 获取属性的值
     * @param className  类的名称
     * @param obj 反射类的对象
     * @param filedName 属性名称
     * @return 属性的值
     */
    public static Object getFieldObject(String className, Object obj, String filedName) {
        try {
            Class obj_class = Class.forName(className);
            return getFieldObject(obj_class, obj, filedName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取字段属性值
     * @param clazz  类的实例
     * @param obj  反射类的对象
     * @param filedName   字段名称
     * @return
     */
    public static Object getFieldObject(Class clazz, Object obj, String filedName) {
        try {
            Field field = clazz.getDeclaredField(filedName);
            field.setAccessible(true);
            return field.get(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     *
     * @param obj
     * @param filedName
     * @param filedVaule
     */
    public static void setFieldObject(Object obj, String filedName, Object filedVaule) {
        setFieldObject(obj.getClass(), obj, filedName, filedVaule);
    }

    /**
     *
     * @param clazz
     * @param obj
     * @param filedName
     * @param filedVaule
     */
    public static void setFieldObject(Class clazz, Object obj, String filedName, Object filedVaule) {
        try {
            Field field = clazz.getDeclaredField(filedName);
            field.setAccessible(true);
            field.set(obj, filedVaule);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     *
     * @param className
     * @param obj
     * @param filedName
     * @param filedVaule
     */
    public static void setFieldObject(String className, Object obj, String filedName, Object filedVaule) {
        try {
            Class obj_class = Class.forName(className);
            setFieldObject(obj_class, obj, filedName, filedVaule);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    public static Object getStaticFieldObject(String className, String filedName) {
        return getFieldObject(className, null, filedName);
    }

    public static Object getStaticFieldObject(Class clazz, String filedName) {
        return getFieldObject(clazz, null, filedName);
    }

    public static void setStaticFieldObject(String classname, String filedName, Object filedVaule) {
        setFieldObject(classname, null, filedName, filedVaule);
    }

    public static void setStaticFieldObject(Class clazz, String filedName, Object filedVaule) {
        setFieldObject(clazz, null, filedName, filedVaule);
    }
}

4.2、工具类的使用

 try {
            Class getTestClass = Class.forName("com.cdv.reflectdemo.TestClassCtor");
            TestClassCtor object = (TestClassCtor) RefInvoke.createObject(getTestClass);
            String s = object.toString();
            Log.e(TAG, "s-》" + s);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }


        //一个参数
        TestClassCtor getTestClass = new TestClassCtor();
        Class paraType1 = int.class;
        Object paraValue1 = 1;
        RefInvoke.createObject(getTestClass.getClass(), paraType1, paraValue1);

        //获取类的方法 并调用
        String methodName = "doSomething";
        Class[] paraType2 = {String.class};
        Object[] paraValue2 = {"test->invokeInstanceMethod"};
        String result = (String) RefInvoke.invokeInstanceMethod(getTestClass, methodName, paraType2, paraValue2);
        Log.e(TAG, "result->" + result);


        // 无参数 私有 静态方法
        String testClassName = "com.cdv.reflectdemo.TestClassCtor";
        String testMethodName = "testStaticMethod";
        String result2 = (String) RefInvoke.invokeStaticMethod(testClassName, testMethodName);
        Log.e(TAG, "result2->" + result2);

        // 有参数  公有  静态方法
        Class paraType = String.class;
        Object paraValue = "有参数  公有  静态方法";
        String result3 = (String) RefInvoke.invokeStaticMethod(testClassName, testMethodName, paraType, paraValue);
        Log.e(TAG, "result3->" + result3);


        //获取属性
        getTestClass.setTestPrivateField("hello");
        String filedName = "testPrivateField";
        String fieldObject = (String) RefInvoke.getFieldObject(getTestClass, filedName);
        Log.e(TAG,"fieldObject-->"+ fieldObject);

        String fieldName = (String)RefInvoke.getFieldObject(testClassName,getTestClass,filedName);
        Log.e(TAG,"fieldName-->"+ fieldName);

五、参考代码

https://github.com/muyexiaogui/DailyExercise/tree/master/reflectdemo

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:44:08  更:2022-03-04 15:45:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:46:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码