Java反射机制

作者: 海晨忆 | 来源:发表于2018-03-07 09:53 被阅读1次

个人博客:haichenyi.com。感谢关注

简介

  在运行过程中,对任意一个类,都能知道这个类的所有属性和方法。对于任一个对象,都能调用他的任意一个方法和属性。这种动态获取信息以及动态调用对象的方法称为java语言的反射机制

用法

我这里就列出我常用的两个方法私有类和变量

方法Methods

方法 用途
getDeclaredMethods() 获取当前类的所有方法,包括public/private/protected/default修饰的方法
getDeclaredMethod(String name, Class<?>... parameterTypes) 获取当前类的某一个方法,包括public/private/protected/default修饰的方法
getMethods() 获取当前类和所继承父类的public标识的所有方法,仅仅包括public
getMethod(String name, Class<?>... parameterTypes) 获取当前类和所继承父类的public标识的某一个方法,仅仅包括public

  上面就是两个类型的方法,一个是只获取当前类的方法,获取当前类的方法,包括所有类型的方法:public/private/protected/default。还有一个是获取当前类和所继承的父类的方法,仅仅包括public修饰的方法。

调用方式

//在TakePhotoActivity.class类中有两个重载方法,一个无参,一个有一个String类型的参数
private void myTest(){
    Log.v("WZ","myTest无参");
  }
private void myTest(String msg){
    Log.v("WZ","myTest有参");
  }
调用无参的方法
TakePhotoActivity takePhotoActivity = new TakePhotoActivity();//new 一个类对象
try {
Class<? extends TakePhotoActivity> aClass1 = takePhotoActivity.getClass();//通过getClass方法获取类对象
//Class<?> aClass = Class.forName("com.haichenyi.mytakephoto.TakePhotoActivity");//通过路径获取Class对象
Method myTest = aClass1.getDeclaredMethod("myTest");
myTest.setAccessible(true);//参数值为true,禁止访问控制检查
myTest.invoke(takePhotoActivity);//执行私有方法
} catch (Exception e) {
      e.printStackTrace();
      Log.v("WZ", e.getMessage());
    }
调用有参的方法
TakePhotoActivity takePhotoActivity = new TakePhotoActivity();//new 一个类对象
Class[] arr = new Class[]{String.class};
try {
Class<? extends TakePhotoActivity> aClass1 = takePhotoActivity.getClass();//通过getClass方法获取类对象
//Class<?> aClass = Class.forName("com.haichenyi.mytakephoto.TakePhotoActivity");//通过路径获取Class对象
Method myTest = aClass1.getDeclaredMethod("myTest",arr);
myTest.setAccessible(true);//参数值为true,禁止访问控制检查
myTest.invoke(takePhotoActivity,"s");//执行私有方法
} catch (Exception e) {
      e.printStackTrace();
      Log.v("WZ", e.getMessage());
    }

有参的方法,在获取方法的时候,传一个Class[]数组,里面的值就是参数类型的类。或者还有另一种传的方法,前面获取方法的时候:

  1. 获取方法的时候,无参的传一个空的Class[],有参就传有值的Class[]数组
  2. 执行方法的时候,无参的传一个空的Object[],有参就传有值的Object[]数组,至于传的值随便写,类型一样就行

变量Field

方法 用途
getDeclaredFields() 获取当前类的所有类型的全局变量,包括public/private/protected/default修饰的变量
getDeclaredField(String name) 获取当前类的某一个类型的全局变量,包括public/private/protected/default修饰的变量
getFields() 获取当前类和继承父类的所有用public修饰的变量
getField(String name) 获取当前类和继承父类的某一个用public修饰的变量

调用方式

//在TakePhotoActivity里面定义
private int flag;
获取变量
TakePhotoActivity takePhotoActivity = new TakePhotoActivity();//new 一个类对象
try {
Class<? extends TakePhotoActivity> aClass1 = takePhotoActivity.getClass();//通过getClass方法获取类对象
//Class<?> aClass = Class.forName("com.haichenyi.mytakephoto.TakePhotoActivity");//通过路径获取Class对象
Field flag = aClass.getDeclaredField("flag");
flag.setAccessible(true);
Object o = flag.get(takePhotoActivity);//这里就获取到了对象
...//做你自己的逻辑处理
} catch (Exception e) {
      e.printStackTrace();
      Log.v("WZ", e.getMessage());
    }
设置变量的值
//获取变量的值跟上面一样
flag.set(takePhotoActivity,10);//这样写会改变TakePhotoActivity中flag的值

工具类

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * Author: 海晨忆.
 * Date: 2018/3/6
 * Desc: 反射工具类
 */
public class ReflectionUtil {

    /***
     * 获取私有成员变量的值
     * 
     */
    public static Object getValue(Object instance, String fieldName)
            throws IllegalAccessException, NoSuchFieldException {

        Field field = instance.getClass().getDeclaredField(fieldName);
        field.setAccessible(true); // 参数值为true,禁止访问控制检查

        return field.get(instance);
    }

    /***
     * 设置私有成员变量的值
     * 
     */
    public static void setValue(Object instance, String fileName, Object value)
            throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {

        Field field = instance.getClass().getDeclaredField(fileName);
        field.setAccessible(true);
        field.set(instance, value);
    }

    /***
     * 访问私有方法
     * 
     */
    public static Object callMethod(Object instance, String methodName, Class[] classes, Object[] objects)
            throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
            InvocationTargetException {

        Method method = instance.getClass().getDeclaredMethod(methodName, classes);
        method.setAccessible(true);
        return method.invoke(instance, objects);
    }
}

相关文章

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之三

    总结内容源自以下文章 粗浅看java反射机制 反射机制应用实践 谈谈java反射机制 Java Reflectio...

  • java反射机制

    java的反射机制 1 JAVA的反射机制是什么?反射机制能做什么?反射机制的优点与缺点2 认识 Class...

  • Java中反射的用途

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在。灵活掌握Java反射机制,对大家以后学习框...

  • Chapter 13 . 反射机制

    阅读原文 Chapter 13 . 反射机制 13.1 Java反射机制研究及应用 Java Reflection...

  • 详解Java反射机制(Reflection)

    详解Java反射机制(Reflection) 反射机制的作用 JAVA反射机制是在运行状态中,对于任意一个类,都能...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

网友评论

    本文标题:Java反射机制

    本文链接:https://www.haomeiwen.com/subject/sdqrfftx.html