学习内容:

(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. pep9伪代码

    Set sum to 0 Read num 1 Set sum to sum + num1 Read num2 Set sum to sum + num2 Read num3 Set sum to s ...

  2. react的”Hello World !“

    本文主要简述react的开始使用 1.引入js文件 <!-- 1.核心文件 --> <script crossorigin src="https://unpkg.com/r ...

  3. ASP.NET Core框架探索(一)

    今天我们来结合源码来探究一下ASP.NET CORE Web框架的运行原理. 可以先整体看一下下面这张基于源码分析过程的一个总结大纲,包含各环节完成的关键步骤: 下面我们将一起来结合源码探索启动一个A ...

  4. Linux安装JDK8环境

    1.下载JDK包 点击同意下载后,会让你注册oracel账号,登录了才能下载 2.上传到linux服务器,然后解压 解压命令(注意jdk的版本名称不一定相同): tar -zxvf jdk-8u181 ...

  5. mybatis 基本配置 学习总结01

    Mybatis 1.什么是Mybatis Mybatis是一款优秀的持久层框架. 几乎避免了所有JDBC代码和手动设置参数以及获取结果集的过程. Mybatis是一个半自动化的ORM框架(Object ...

  6. CF917D题解

    题目大意 一张有 \(n\) 个节点的完全图,再给出这张图的一棵生成树,问该图有多少颗生成树和这颗生成树的公共边总共有 \(k\) 条,求助 \(0 \leq k \leq n-1\) 时所有 \(k ...

  7. Net6 Configuration & Options 源码分析 Part2 Options

    Net6 Configuration & Options 源码分析 Part2 Options 第二部分主要记录Options 模型 OptionsConfigurationServiceCo ...

  8. SQL学习日记

    目录 SQL学习日记 1. 常见的数据库对象 2. DDL 定义语句 3. DML 操作语句 4. DQL 查询语句 5. DCL 控制语句 SQL学习日记 1. 常见的数据库对象 对象名 关键字 描 ...

  9. Spring Boot 自定义Starter 可能引发的问题(Error)

    如果你的项目出现: Consider defining a bean of type 'com.wy.helloworld_spring_boot_starter.PersonService' in ...

  10. RESTful API设计规范总结

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 它的大原则容易把握,但是细节不容易做对.本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API. ...