java反射 invoke详解
2019独角兽企业重金招聘Python工程师标准>>>
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判定任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
package com.java.jvm;import java.lang.reflect.*;class InvokeTest {public static void main(String[] args) {try {Class c = Class.forName("com.java.jvm.User");Object o = c.newInstance();Method m = c.getMethod("getName", null);Object ret = m.invoke(o, null);System.out.println( "com.java.jvm.User.getName() = " + ret);m = c.getMethod("setName", new Class[]{String.class});ret = m.invoke(o, new Object[]{"shengjian"});System.out.println( "com.java.jvm.User.setName() = " + ret);m = c.getMethod("getName", null);ret = m.invoke(o, null);System.out.println( "com.java.jvm.User.getName() = " + ret);//静态方法的调用m = c.getMethod("getUserName", new Class[]{String.class});ret = m.invoke(null, "fuwang");System.out.println( "com.java.jvm.User.getUserName() = " + ret);} catch (ClassNotFoundException ex) {System.out.println("找不到此类别");} catch (NoSuchMethodException ex) {System.out.println("此方法不存在");} catch (IllegalAccessException ex) {System.out.println("没有权限调用此方法");} catch (InvocationTargetException ex) {System.out.println("调用此方法时发生下列例外:\n" + ex.getTargetException());} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}}
}
c.getMethod("getName", null)返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。
name - 方法名 parameterTypes - 参数列表
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。
invoke()
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
如果底层方法是静态的,那么可以忽略指定的 obj 参数。该参数可以为 null。
如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。
如果底层方法是实例方法,则使用动态方法查找来调用它,这一点记录在 Java Language Specification, Second Edition 的第 15.12.4.4 节中;在发生基于目标对象的运行时类型的重写时更应该这样做。
如果底层方法是静态的,并且尚未初始化声明此方法的类,则会将其初始化。
如果方法正常完成,则将该方法返回的值返回给调用者;如果该值为基本类型,则首先适当地将其包装在对象中。但是,如果该值的类型为一组基本类型,则数组元素不 被包装在对象中;换句话说,将返回基本类型的数组。如果底层方法返回类型为 void,则该调用返回 null。
obj - 从中调用底层方法的对象args - 用于方法调用的参数。
User代码:
package com.java.jvm;public class User {static{System.out.println("static ---");}public User(){System.out.println("name="+name);name="xiaotian";}private String name;private Integer age;private String address;public static String getUserName(String name){return name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User [name=" + name + ", age=" + age + ", address=" + address+ "]";}}
转载于:https://my.oschina.net/winHerson/blog/132410
java反射 invoke详解相关推荐
- java 反射机制详解
火星十一郎 海纳百川, 有容乃大,QQ:791909235,Tel:13137910179 posts - 774, comments - 556, trackbacks - 0, articles ...
- java反射机制详解篇一(基础)
反射基础 首先来看一下最常规的创建对象的方式: ObjectClass clazz = new ObjectClass(); 当程序执行到new ObjectClass的时候,java虚拟机会加载Ob ...
- java反射机制详解_Java反射机制详解
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...
- [转]Java反射机制详解
目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...
- Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
文章目录 前言 一.私有方法在本类中直接调用 1.1.在本类中实例化,调用私有方法 1.2.尝试在其他类直接调用私有方法(错误示范) 二.使用反射实例化类强制调用私有方法 2.1.使用类加载器加载被调 ...
- Java反射体系详解
文章目录 1.获取一个类的对应的Class对象 (Class的C是大写) (1)调用Object提供的getClass方法 (2)类名称 . class (3)调用Class类提供的静态方法:Clas ...
- Java反射技术详解
前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替 ...
- java反射机制详解_JAVA反射机制详解_JSP/Java编程_互联网开发技术网_传播最新的编程技术_php361.com...
今天,下午在和朋友聊天的时候,聊起了反射这个话题. 我们就从下面这个段简单的代码开始吧. 这个代码输出什么,想必大部分的读者跟我一样,会很快地知道答案:0 1 2 3 4 5 6 7 8 9.事实也是 ...
- Java反射机制详解
文章目录 1.反射 1.1 反射的概述 为什么需要反射? 1.2 获取Class类对象的三种方式 1.2.1 代码示例 1.3 反射获取构造方法并应用 1.3.1 Class类获取构造方法对象的方法 ...
最新文章
- java SpringWeb如何实现打印日志
- jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常
- OpenStack 的 SR-IOV 虚拟机热迁移
- 天通苑海鲜餐馆数据调查,很难想象消费越贵越受欢迎
- Ubuntu11.04 3945ABG无线网卡驱动安装
- python学习与数据挖掘_python机器学习与数据挖掘
- poj 1426 BFS
- pip下载慢的解决方法
- mysql 备份如何使用_如何使用命令来备份和还原MySQL数据库
- Tesseract-OCR的简单使用与训练
- Smart ORM v0.3发布(完全面向对象的轻量级ORM工具)
- python有哪几种类型转换方式_Python 中各种时间类型的转换
- 拓端tecdat|ARIMA模型预测CO2浓度时间序列-python实现
- 关于51CTO民意调查之自主添加google广告代码的几点意见
- this.controls指所有控件吗?_PPT特效制作案例:2019年小目标,你定了吗?(用文本框控件制作)...
- esayUI实践的一些体会
- 短视频服务大PK,阿里云、腾讯云、又拍云、七牛云、金山云5强横向对比
- tp 框架防sql注入
- 第22.7节 性能篇-使用八叉树结构来管理场景
- 微信小程序底部导航栏未读消息出现小红点的实现