zoukankan      html  css  js  c++  java
  • 玩转java反射

    玩玩JAVA反射

    什么是反射

    • Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任何一个方法和属性;这样动态获取新的以及动态调用对象的方法的功能就叫做反射。
    • 简单来说反射就是解剖一个类,然后获取这个类中的属性和方法,前提是要获取这个类的Class对象。
    • 在java中,给我们提供几个类用于描述编译后的对象  

    描述

    java.lang.Class

    描述编译后的class文件的对象

    java.lang.reflect.Constructor

    用于描述构造方法

    java.lang.reflect.Field

    描述字段(成员变量)

    java.lang.reflect.Method

    描述成员方法

    如何使用反射

    1、使用Class类,获取出被解剖的这个类的class文件对象

    2、使用Class类方法,获取出类中的所有成员

    3、将成员获取出来后,交给对应类,对应类中的方法,运行成员

    如何获取class文件对象

    • 使用类的对象获取

    调用Object类的getClass() 方法,obj.getClass()

    • 使用类的静态属性获取

    ClassName.class

    • 使用Class类的静态方法获取

    Class.forName("类名");

     

    不管用哪种方式获取的Class对象,他们都是相等的。

    获取类对象

    • 获取Field
    Class cls = xxx.class;
    Field[] fields1 = cls.getFields();//获取Class对象里面所有public的成员变量
    Field[] fields2 = cls.getDeclaredFields();//获取Class对象中所有的成员变量
    Field field1 = cls.getField("a");//获取Class对象中名字为 a 的成员变量
    Field field2 = cls.getDeclaredField("b");//获取Class对象中名字为 b 的成员变量
    • 获取Method
    Class cls = xxx.class;
    Method[] methods = cls.getMethods(); //获取Class对象里面所有public的方法
    Method[] declaredMethods = cls.getDeclaredMethods(); //获取Class对象里面所有public的方法
    Method[] method1 = cls.getMethod("method"); //获取Class对象里面所有public的方法
    Method declaredMethod1 = cls.getDeclaredMethod(""); //获取Class对象里面所有public的方法
    • 获取构造函数
    Constructor[] constructors = cls.getConstructors(); //获取所有public构造函数
    Constructor[] declaredConstructors = cls.getDeclaredConstructors(); //获取所有构造函数,包括private构造函数
    Constructor constructor = cls.getConstructor(String.class); //获取指定参数public构造函数
    Constructor declaredConstructor = cls.getDeclaredConstructor(Integer.class); //获取指定参数的构造函数,也可以private

    修改Field

    对于private的属性,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。

    Field field = xxx;
    //private field 需要设置 accessible
    //field.setAccessible(true);
    //obj是对象,value是要设置的值
    field.set(obj,value);

    调用方法

    对于private的方法,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。

    Method method = xxx;
    //private 方法需要设置 accessible
    //method.setAccessible(true);
    //obj为对象,param1,param2 为参数,当方法无参时,直接调用 method.invoke(obj); 即可
    method.invoke(obj,param1,param2...)

      

  • 相关阅读:
    hdu5754_找规律+威佐夫博弈
    codeforce645C_尺取法
    hdu4336_容斥dp
    poj3071_概率dp
    codeforces148D_推论题
    poj2151_概率dp
    hdu3853_概率dp
    POJ 1410 判断线段与矩形交点或在矩形内
    POJ 1066 Treasure Hunt 线段相交判断
    POJ 2653 Pick-up sticks 判断线段相交
  • 原文地址:https://www.cnblogs.com/jfound/p/12900641.html
Copyright © 2011-2022 走看看