学习内容:

(1)获取构造函数
这里不贴Person类了,不然代码太多太乱了,只给出一些常用API

// 创建字节码对象
Class<?> aClass = Class.forName("com.yy.Person");
// 1、获取公共无参的构造方法
Constructor<?> constructor = aClass.getConstructor();
// 2、获取公共有参的构造方法
Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class)
// 3、获取私有的无参构造方法
Constructor<?> priConstructor = bClass.getDeclaredConstructor();
// 4、获取私有的有参构造方法
Constructor<?> priConstructor1 = bClass.getDeclaredConstructor(String.class, int.class);
// 5、通过公共无参构造创建对象
Object o = constructor.newInstance();
// 6、通过私有构造器创建实例对象,私有构造器调用必须让Java检测机制忽略访问权限(暴力反射)
priConstructor1.setAccessible(true);
Object obj = priConstructor1.newInstance("熊大", 15);

(2)获取方法
Person中的add、del、set、query都是我自定义的方法,具体类型看注释

// 创建字节码对象
Class<?> aClass = Class.forName("com.yy.Person");
// 1、通过字节码对象获取公共无参方法
Method add = aClass.getMethod("add");
// 2、通过字节码对象获取私有无参方法
Method del = aClass.getDeclaredMethod("del");
// 3、通过字节码对象获取公共有参方法
Method set = aClass.getMethod("set", String.class);
// 4、通过字节码对象获取私有有参方法
Method query = aClass.getDeclaredMethod("query", String.class, int.class);
// 5、调用公共有参方法,o是字节码对象调用构造方法创建出来的对象
Object obj = set.invoke(o, "小肥羊");
// 6、调用私有方法,o是字节码对象调用构造方法创建出来的对象,私有方法调用必须让Java检测机制忽略访问权限(暴力反射)
query.setAccessible(true);
Object obj2 = query.invoke(o, "大肥羊", 11);

(3)内省机制获取JavaBean字段

public void testSetIntrospect() throws ClassNotFoundException, IllegalAccessException, InstantiationException, IntrospectionException, InvocationTargetException {
// 1、创建字节码对象
Class<?> aClass = Class.forName("com.yy.Person");
// 2、获取构造器并通过构造器创建实例
Object o = aClass.newInstance();
// 3、通过 Introspector 类把bean信息封装到 beanInfo 中
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
// 4、通过 getPropertyDescriptors() 获取一个属性数组
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
// 5、遍历属性数组,并通过比较属性获取该属性的Set方法,然后利用该Set方法给对象设置值
for(PropertyDescriptor pd : propertyDescriptors) {
// 获取属性名
String name = pd.getName();
System.out.println("name = " + name);
// 获取Get方法
Method getMethod = pd.getReadMethod();
// 获取Set方法
Method setMethod = pd.getWriteMethod();
// 当方法名为 name 时进入(Get、Set都能进入)
if(name.equals("name")) {
// 执行 name 的 Set 方法
setMethod.invoke(o, "小肥羊");
System.out.println("o = " + o);
}
// 执行Get方法
Object invoke = getMethod.invoke(o);
System.out.println("invoke = " + invoke);
}
}

总结:

以上就是反射常用的API以及内省机制的代码了,反射基础去看我的上一篇博客:博客地址

反射常用API以及内省机制(代码)的更多相关文章

  1. 【代码笔记】Java——远程监控、反射、代理、内省机制

    远程控制的基本原理 远程控制(RemoteControl)拥有控制端和被控端双方. 控制方通过请求,取得对远端的操作,实现远端的事件回放功能,同时,应该看得到远端桌面的画面.而被控方必须在建立Serv ...

  2. 反射常用API

    反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...

  3. Java反射常用API汇总

    “JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性” 一.类对象的获取 1.通过对象获取 Object obj = ne ...

  4. kafka中常用API的简单JAVA代码

    通过之前<kafka分布式消息队列介绍以及集群安装>的介绍,对kafka有了初步的了解.本文主要讲述java代码中常用的操作. 准备:增加kafka依赖 <dependency> ...

  5. jackson学习之三:常用API操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. (反射+内省机制的运用)简单模拟spring IoC容器的操作

    简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...

  7. 反射的常用API

    反射的常用API 加载程序集 Assembly assembly = Assembly.Load("程序集名称"); // 从前目录加载程序集,提供程序集名称,无后缀 Assemb ...

  8. java内省机制及PropertyUtils使用方法

    背景 一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值.但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.bean ...

  9. Java内省机制

    转自: https://blog.csdn.net/hahalzb/article/details/5972421 1.java内省机制其实通俗的理解为,对自身的进行一个扫描,这个扫描的对象就是我们普 ...

随机推荐

  1. 有效提升Python代码性能的三个层面

    使用python进入一个熟练的状态之后就会思考提升代码的性能,尤其是python的执行效率还有很大提升空间(委婉的说法).面对提升效率这个话题,python自身提供了很多高性能模块,很多大牛开发出了高 ...

  2. laravel7 搜索分页

    html: <form action="{{url('http://www.yanbing.com/fang/index')}}" method="get" ...

  3. 微信小程序断网处理

    wx.onNetworkStatusChange(function callback) 参数 function callback 网络状态变化事件的回调函数 参数 Object res 属性 类型 说 ...

  4. PhpStrom 好用的翻译插件

    最近php使用laravel框架的比较多,里面的注释都是英文的,有些同学的英语不是很好,不过不用但是侯蜀黍带你一个好用的翻译插件,告别烦恼一了百了 Translation 翻译插件 安装: 打开Fil ...

  5. Ajax结合THymeleaf使用

    <script type="text/javascript"> //通过$("标签"),也可以使用id的点击事件 $("a"). ...

  6. 实践1使用XGB实现酒店信息消歧

    XGB算法是决策树衍生出来的一种算法 场景:酒店的业务人员希望我们能够提供一个算法服务去为酒店信息做一个自动化的匹配,以通过算法的手段,找到那些确定相同的酒店和确定不同的酒店 以下代码为部分 理解业务 ...

  7. 初探JVM字节码

    作者: LemonNan 原文地址: https://juejin.im/post/6885658003811827725 代码地址: https://github.com/LemonLmNan/By ...

  8. Owin + WebApi + OAuth2 搭建授权模式(授权码模式 Part I)

    绪 最近想要整理自己代码封装成库,也十分想把自己的设计思路贴出来让大家指正,奈何时间真的不随人意. 想要使用 OWIN 做中间件服务,该服务中包含 管线.授权 两部分.于是决定使用 webapi .O ...

  9. HTML 基础及超链接练习

    实验一:HTML 基础及超链接练习 实验目的: 熟悉 HTML 基础及超链接的使用 实验要求: 1.建立至少 3 个以上的网页: 2.实现任意两网页之间的跳转(建议做个导航菜单): 3.每个网页里面至 ...

  10. JVM知识梳理

    JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java 程序设计语言 Java 虚拟机 Java API类库 JRE 是什么? JRE 是支持 Java 程序运行的标准环境. ...