反射常用API以及内省机制(代码)
学习内容:
(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以及内省机制(代码)的更多相关文章
- 【代码笔记】Java——远程监控、反射、代理、内省机制
远程控制的基本原理 远程控制(RemoteControl)拥有控制端和被控端双方. 控制方通过请求,取得对远端的操作,实现远端的事件回放功能,同时,应该看得到远端桌面的画面.而被控方必须在建立Serv ...
- 反射常用API
反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...
- Java反射常用API汇总
“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性” 一.类对象的获取 1.通过对象获取 Object obj = ne ...
- kafka中常用API的简单JAVA代码
通过之前<kafka分布式消息队列介绍以及集群安装>的介绍,对kafka有了初步的了解.本文主要讲述java代码中常用的操作. 准备:增加kafka依赖 <dependency> ...
- jackson学习之三:常用API操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- (反射+内省机制的运用)简单模拟spring IoC容器的操作
简单模拟spring IoC容器的操作[管理对象的创建.管理对象的依赖关系,例如属性设置] 实体类Hello package com.shan.hello; public class Hello { ...
- 反射的常用API
反射的常用API 加载程序集 Assembly assembly = Assembly.Load("程序集名称"); // 从前目录加载程序集,提供程序集名称,无后缀 Assemb ...
- java内省机制及PropertyUtils使用方法
背景 一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值.但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.bean ...
- Java内省机制
转自: https://blog.csdn.net/hahalzb/article/details/5972421 1.java内省机制其实通俗的理解为,对自身的进行一个扫描,这个扫描的对象就是我们普 ...
随机推荐
- linux下的硬盘分区、格式化、挂载
linux下的MBR(msdos)分区.格式化.挂载 在linux下,需要使用一块硬盘. 需要进行以下四步: 识别硬盘-----分区规划-----格式化-----挂载 步骤一:分区规划 MBR模式分区 ...
- 微信小程序断网处理
wx.onNetworkStatusChange(function callback) 参数 function callback 网络状态变化事件的回调函数 参数 Object res 属性 类型 说 ...
- php 23种设计模式 - 设计模式简介以及分类
一. Introduction[介绍] 设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题.设计模式并不一定就是一个类库或者第三方框架,它们更多的表现为一种思想并且广泛地应用在系 ...
- 浅浅的聊一下 WebSocket
第一次看到 ws:// 和 wss:// 时候,感觉好高级啊,还有这种协议. Websocket 历史 WebSocket是在2008年6月诞生的1.经由IEFT标准化后,2009年chrome 4第 ...
- 【系列】关于NJUPT电赛自控方向第一次积分赛的总结
本人是NJUPT电子科学与技术专业大一摸鱼狗一枚.本博客旨在总结与分享个人准备电赛所学知识,同时也是为了防止遗忘,锻炼写文章的能力.目前电赛方向为自控方向.主要研究方向为单片机.图像处理.自动控制相关 ...
- CF1386C口胡
自己在物理课上编了一道题,大概就是这题把删除区间的边改为保留区间的边...都不觉得判断短路和判断二分图有点儿像吗 题意:给定一张无向图,每次暂时删除一个区间内的边,问删除后这个区间是否为二分图. 首先 ...
- CF1534F1题解
首先,对于一个在第 \(i\) 行 \(j\) 列的沙子,如果他开始下降,他能够使哪些沙子下降呢? 很容易得知是第 \(j-1,j,j+1\) 列所有行号不小于 \(i\) 的沙子. 对于沙子 \(u ...
- Vtune工具简介
VTune是 Intel 提供的一个强大的应用程序性能分析软件,VTune Amplifier XE 2011 集成了Intel VTune Performance Analyzer 和 Thread ...
- Python 远程开发环境部署与调试
一.下载相应开发工具 Pycharm :下载地址 二.部署开发机 一般在工作过程中,开发环境并不是本地环境,而是指在开发机:因为,有很多依赖本地部署非常麻烦,而开发机中则内置了很多相关的服务 三.代 ...
- 【编程教室】Python绘制冬奥吉祥物“冰墩墩”
大家好,欢迎来到 Crossin的编程教室 ! 这两天,随着北京冬奥会的开幕,吉祥物"冰墩墩"可是火出了圈,多少人排长队都买不到.据说甚至有人把价格炒到了几千元. 就连昨天的&qu ...