一、调用指定方法

通过反射,调用类中的方法,通过Method类完成。步骤:

1、通过Class类的getMethod(String name,Class.......parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。

2、使用Object invoke(Object obj,Object[ ] args)进行调用,并向方法中传递要设置的obj对象的参数信息。

说明
     1.Object 对应原方法的返回值,若原方法无返回值,此时返回null
     2.若原方法若为静态方法,此时形参Object obj可为null
     3.若原方法形参列表为空,则Object[] args为null
     4.若原方法声明为private,则需要在调用此invoke()方法前,显式调用方法对象的setAccessible(true)方法,将可访问private的方法。

/**
 * 调用运行时类中指定的方法
 */
@Test
public void test3() throws Exception {//1、创建运行时类
    Class clazz = Person.class;
    //2、创建Method对象
    Method m1 = clazz.getMethod("show");
    //3、创建运行时类所对应的对象
    Person p = (Person) clazz.newInstance();
    //4、调用方法
    m1.invoke(p);

    //私有方法
    Method m2 = clazz.getDeclaredMethod("display", String.class);
    m2.setAccessible(true);
    m2.invoke(p,"中国");

}

构造器

/**
 * 调用指定类型的构造器创建对象
 */
@Test
public void test4() throws Exception {String className = "Progress.reflection.Person";
    Class clazz = Class.forName(className);

    //private修饰的构造器
    Constructor con = clazz.getDeclaredConstructor(String.class, Integer.class);
    con.setAccessible(true);
    Person p = (Person) con.newInstance("小汐",34);
    System.out.println(p);
}

二、调用指定属性以及赋值

在反射机制中,可以直接通过Field类操作类中的属性,通过Field类提供的set( )和get( )方法就可以完成设置和取得属性类容的操作。

  • public Field getField(String name);返回此Class对象表示的类或接口的指定的public的Field
  • public Field getDeclareField(String name);返回此对象表示的类或接口的指定的Field。

在Field中:

  • public Object get(Object obj); 取得指定对象obj上此Field的属性内容。
  • public void set(Object obj,Object value); 设置指定对象obj上此Field的属性内容。

注:在类中属性都设置为private的情况下,在使用set和get方法时,首先要使用Field类中的setAccessible(true)方法将需要操作的属性设置为可以被外部访问。

  • public void setAccessible(true);访问私有属性时,让这个属性可见。
/**
 * 调用运行时类中指定的属性
 */
@Test
public void test3() throws Exception {Class clazz = Person.class;
    //1、获取指定的属性
    //getField:这种写法是类的属性范围设置为public
    Field name = clazz.getField("name");
    //2、创建运行时类的对象
    Person p = (Person) clazz.newInstance();
    //3、将运行时类的指定的属性赋值
    name.set(p,"jerry");

    //getDeclaredField: 这种写法是类的属性范围设置为private

    Field age = clazz.getDeclaredField("age");
    age.setAccessible(true);
    age.set(p,34);
    System.out.println(p);
}

反射_通过反射调用类中指定方法、属性相关推荐

  1. kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用

    kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...

  2. php怎么调用类里面的方法_php调用类中的方法

    PHP外文名:PHP: Hypertext Preprocessor,中文名:超文本预处理器是一种通用开源脚本语言.可以是未实例化的类名直接调用.下面由小编整理了几种php调用类中的方法,希望对大家有 ...

  3. php的call_user_func函数实现调用类中的方法

    php的call_user_func函数实现调用类中的方法 解决方法: call_user_func(array($classname,'doindex')); 例子:http://www.yayi​ ...

  4. python类的属性和对象属性_在python的类中动态添加属性与生成对象

    本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...

  5. python类内部方法调用_python如何调用类中的方法

    调用同一个类中的方法 首先类中的方法在定义的时候需要先加参数self,例如:def SaveData(self,ip): print(ip)如果无self参数则不能在同一个类中调用(之前一直在这里犯错 ...

  6. java通过反射调用方法_Java_通过反射调用类中的方法

    packagecom.lkb.autoCode.util;importcom.lkb.autoCode.constant.AutoCodeConstant;importjava.lang.reflec ...

  7. Java反射机制demo(五)—获得并调用一个类中的方法

    这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和运行结果.获取所有的方法使用Class类中getMetho ...

  8. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?

    文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...

  9. 利用Java反射机制调用类的私有方法

    利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...

最新文章

  1. C++11中头文件chrono的使用
  2. 【机器学习】如何简单形象又有趣地讲解神经网络是什么?
  3. 合格的后端Coder都应该写好UT和Mock测试
  4. Docker - 手动迁移镜像
  5. 从零点五开始用Unity做半个2D战棋小游戏(六)
  6. 程序员的数学 pdf_作为一个程序员,分享我日常学习方式,自学渠道和方式
  7. Linux系统的基本安装
  8. android studio1.5 for mac,适用于Mac的Android Studio 1.5.x随机崩溃
  9. MapReduce程序之数据排序
  10. 分割view窗口不响应onmousewheel_什么是响应者链?ios面试攻克篇(三)
  11. Codeforces 994 C - Two Squares
  12. 构建一个完整的中文智能问答系统
  13. vba while 结束_Python | 教材纰漏,出现while的无限循环错误
  14. HTML - html简介和开发环境搭建
  15. 基于Python实现四子棋游戏
  16. 笔记本电脑怎么设置wifi热点共享
  17. 狄拉克函数和广义函数 | 线性泛函
  18. java sencha_Sencha学习入门
  19. 【征文大赛】TiDB 社区第二届征文大赛,一次性带走社区全部新周边,还有bose 降噪耳机、倍轻松按摩仪等你拿!
  20. matlab的基本用法---常用的输入输出函数

热门文章

  1. 从Mybatis源码中,学习到的10种设计模式
  2. 光环国际PMP:如何成为团队的佼佼者
  3. 陕西省计算机学业水平管理系统,陕西高中学业水平考试成绩查询系统入口
  4. 蚁创互联告诉您何为品牌霸屏?“品牌霸屏”是什么意思呢?
  5. linux技能包【6】:内核升级
  6. java 弹力球_pygame实现弹力球及其变速效果
  7. 片外FLASH(W25Q)和EEPROM(AT24c02)比较
  8. HP Probook 4321s 网卡无法识别问题的解决
  9. 智能办公系统,促进智慧医院高效办公
  10. 开复老师给我的启迪!