zoukankan      html  css  js  c++  java
  • 反射②:调用构造方法、普通方法以及成员变量

     先获取一个类(如Student)

    Class clazz = Student.class;

    ①获取构造方法:借助Class类某些可以获取对应类中声明的构造方法实例对象

    //Test测试
    //返回该对象表示类参数列表相匹配的public构造方法(不含继承)对应的Constructor对象 Constructor constructor = clazz.getConstructor();//public
    //返回该对象表示类参数列表相匹配的构造方法(不区分访问权限)对应的Constructor对象 Constructor constructor = clazz.getDeclaredConstructor();//不区分访问权限//返回该对象表示类包含的所有public构造方法(不含继承)对应的Constructor对象数组 Constructor[] constructors= clazz.getConstructors();//public

    //返回该对象表示类所声明所有的构造方法(不区分访问权限)对应的Constructor对象 constructors= clazz.getDeclaredConstructors();//不区分访问权限

    ②操作构造方法——获取构造方法信息

    //获取一个构造方法
    Constructor constructor = clazz.getConstructor();
    
    //返回声明Constructor对象对应构造方法的类Class对象
    clazz = constructor.getDeclaringClass();
    
    //以整数形式返回Constructor对象表示的构造函数的修饰符
    int mod = constructor.getModifiers();
    String result = Modifier.toString(mod);//输出result即结果
    
    
    //以字符串形式返回Constructor对象所表示的构造方法的名称
    String res = constructor.getName();
    
    //返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组,如果构造方法没有参数,则数组长度为0
    Class [] types = constructor.getParameterTypes();

     ③操作构造方法——创建对象

    Constructor constructor = clazz.getConstructor();
    
    //调用构造函数是否忽略访问权限的影响,true忽略,false不忽略
    constructor.setAccessible(true);
    
    //使用Constructor对象表示的构造方法来创建声明该构造方法类的新对象,括号内为传入构造方法中的参数,如果没有则可设定为null或一个长度为0的数组
    Object object = constructor.newInstance();

    ④获取普通方法:借助Class类某些可以获取对应类中声明的普通方法实例对象

    //单个
    //返回与该Class对象表示类或接口中方法形参类型相匹配的public方法的Method对象
    Method method = clazz.getMethod("methodName",Type);//public 包括继承自父类的
    
    //返回与该Class对象表示类或接口中方法名和方法形参类型相匹配方法(不含继承的)对应的Method对象。
    method = clazz.getDeclaredMethod("doHomework",String.class);//忽略访问权限
    
    //所有
    //返回一个该Class对象表示类或接口中所有public方法(含继承的)对应的Method对象数组。
    Method[] methods = clazz.getMethods();//所有public 含继承自父类的
    //返回一个该Class对象表示类或接口内声明定义的所有访问权限的方法(不含继承的)对应的Method对象数组。
    methods = clazz.getDeclaredMethods();//忽略访问权限  所有的

    ⑤操作普通方法——获取普通方法信息

    //获取一个方法
    Method method = clazz.getDeclaredMethod("name",Type);
    
    //返回声明Method对象表示方法的类或接口的 Class 对象
    method.getDeclaringClass();
    
    //以整数形式返回此Method对象所表示方法的修饰符。
    int mod = method.getModifiers();
    String result = Modifier.toString(mod);
                
    //返回Method对象所表示的方法的返回值类型所对应的Class对象
    clazz = method.getReturnType();
        
    //返回方法名
    method.getName();/
    
    //返回由Method对象代表方法的形参类型对应Class对象组成的数组
    method.getParameterTypes();

    ⑥操作普通方法——调用普通方法

    //获取方法
    Method method = clazz.getDeclaredMethod("name",Type);
    
    //调用方法时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
    method.setAccessible(true);
    
    //调用Method对象指代的方法并返回Object类型结果。obj表示该方法所在类实例,如果方法时静态的则obj可以指定为null; args表示传入该方法的参数,如果方法没有参数,则args数组长度可以为 0 或 null 。
    Object obj = method.invoke(Object,Object);//反射不区分方法是否为静态非静态

    ⑦获取成员变量:借助Class类某些可以获取对应类中声明的成员变量实例对象

    //单个
    //返回该Class对象表示类或接口中与指定属性名(含继承的)相同的public 属性对应的Field对象。
    Field field = clazz.getField(String fieldName);//public
    
    //返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组。
    field = clazz.getDeclaredField(String fieldName);//所有
    
    //返回一个该Class对象表示类或接口中所有public属性(含继承的)对应的Field对象数组。
    Field[] fields = clazz.getFields();
    
    //返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组。
     fields = clazz.getDeclaredFields();

    ⑧操作成员变量——获取成员变量信息

    Field field = clazz.getField(String fieldName);
    //返回声明Field对象表示字段的类或接口所对应的Class对象。 
    clazz = field.getDeclaringClass();
    
    //返回Field对象表示字段的名称。
    clazz = field.getName();
    
    //返回Field对象所表示字段的数据类型所对应的Class对象。
    clazz = field.getType();
    
    //以整数形式返回Field对象表示的字段的修饰符
    int mod = field.getModifiers();
    String result = Field.toString(mod);

    ⑨操作成员变量——获取以及设置成员变量的值

    Field field = clazz.getField(String fieldName);
    
    //设置或获取属性值时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
    field.setAccessible(true);
    
    
    //返回Field表示字段的Object类型的值。obj为该属性所在类创建的对象,如果该属性是静态的,则可设置为null。
    field.get(Object obj);//获取值
    
    //为Field对象表示属性设置新值。obj为该属性所在类创建的对象,如果该属性为静态的则课设置为null;value为该属性新值。
    field.set(Object obj, Object value);//设置值

     

  • 相关阅读:
    用chardet判断字符编码的方法
    NLP--edit distance
    nfc是什么?nfc功能是什么?
    【转载】推荐系统的十大挑战
    python--网络爬虫一
    【转载】双调欧几里得距离的算法原理
    Java并发编程:线程池的使用
    Java集合--HashMap源码剖析
    java中集合类详解
    java collection接口源码
  • 原文地址:https://www.cnblogs.com/yimengxianzhi/p/12163182.html
Copyright © 2011-2022 走看看