转|java反射方法和使用
概述
java中不通过new关键字获取对象并且使用类对象中的成员变量和方法,第一时间我们会想到可以使用反射去实现这些功能。反射很强大,而且是Spring的常用轮子,故我们学会了它就可以搭配很多东西一起使用,下面一起来学习使用反射吧!
使用Book类来练习反射,代码如下:
public class Book {
private Integer id;
private String name;
public Integer age;
public Book() {
System.out.println("Public 无参构造函数");
}
public Book(String name) {
System.out.println("Public 带参构造函数");
}
private Book(String name,Double price){
System.out.println("Private 带两参构造函数");
}
public void printAll(){
System.out.println("公开方法");
}
private void printOne(){
System.out.println("私有方法");
}
}
获取类的三种方式
第一种:使用Class.forName
使用 Class.forName(String classPath)
时,请求参数classPath写需要反射的类名,一般是以包名.类名。
try {
Class clz = Class.forName("com.entity.Book");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
第二种:使用类名.class
使用这种方法时,需要知道有这个类。
Class clz = Book.class;
第三种:对象.getClass()
使用的前提是对象已经被实例化。
Book book = new Book();
Class clz = book.getClass();
总结:这三种方法各有千秋,我们一般使用第一种方式,在开发中,请按照自己的实际需求去使用。
获取构造函数
getDeclaredConstructors(); 获取所有的构造函数
getDeclaredConstructor(参数类型); 获取一个指定参数类型的构造函数
getConstructors(); 获取所有公共的构造函数
getConstructor(参数类型); 获取一个指定参数类型的、public修饰的构造函数
使用方法:
//获取所有的构造函数
Constructor[] constructors = clz.getDeclaredConstructors();
//获取单个所有的构造函数
try {
Constructor constructor =
clz.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
//获取所有的公开构造函数
Constructor[] constructors1 = clz.getConstructors();
//获取单个公开构造函数
try {
Constructor constructor = clz.getConstructor(String.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
获取名字
返回类型:String,可以反射类名、方法名和构造函数名等等。
getName(); //获取全名 例如:com.bean.Book
getSimpleName() //获取类名 例如:Book
Class clz = Book.class;
String name1 = clz.getName();
String name2 = clz.getSimpleName();
获取包
返回类型:Package
Package aPackage = clz.getPackage();
获取接口
getInterfaces(),
返回类型:Class[] interfaces
Class[] interfaces = clz.getInterfaces();
获取父类/超类
getSuperclass()
返回类型:Class superclass
Class superclass = clz.getSuperclass();
实例化对象
语法糖:newInstance(Object initargs)
第一种方式
Class clz = Book.class;
Object obj = clz.newInstance(); //将创建一个无参book对象
第二种方式
Class clz = Book.class;
Constructor constructor = clz.getDeclaredConstructor(); //获得无参构造
Object obj = constructor.newInstance(); //实例化book对象
设置访问属性
clz.setAccessible(true) //可访问
clz.setAccessible(false) //不可访问
//默认是false
Field id = clz.getField("age"); //age字段
id.setAccessible(true); //设为可访问
id.setAccessible(false); //设为不可访问
获取方法
- getMethods():获取所有的公共方法,注意,它会将系统自带的方法也得到
- getMethod(String name):获取单个公共方法,由参数指定方法名
- getDeclaredMethods():获取所有的方法,注意:它不会获取系统自带的方法
- getDeclaredMethod(String name):获取单个的所有方法 参数是可指定方法名
Class clz = Class.forName("Book");
Method[] methods = clz.getMethods(); //获取所有的公共方法
for (Method method : methods) {
System.out.println(method.getName());
}
Method method = clz.getMethod("printAll"); // 获取单个公共方法
method.invoke(clz.newInstance(), null); // 调用方法
Method[] methods = clz.getDeclaredMethods(); //获取所有方法
for (Method method1 : methods) {
System.out.println(method1.getName());
}
Method method1 = clz.getDeclaredMethod("printOne"); //获取单个公共方法
System.out.println(method1.getName());
调用方法
method.invoke(Object obj,Object... args)
obj:如果是实例方法,则传入该方法的类对象;如果是静态方法,写null。
args:方法的参数值,没有写null,或不写都行
// 获取单个的public方法,无法获取private方法
Method method = clz.getMethod("printAll");
//使用方法
method.invoke(clz.newInstance(),null);
结束语
对于Java反射,您怎么看?欢迎参与话题互动讨论,分享你的观点和看法, 评论区留言哦,喜欢小编文章的朋友请点赞,谢谢您的参与!
Reference
[1] https://www.cnblogs.com/liweixml/p/11462813.html
转|java反射方法和使用的更多相关文章
- 【译】5. Java反射——方法
原文地址:http://tutorials.jenkov.com/java-reflection/methods.html ====================================== ...
- Java反射-方法(Method)
工作了三年,第二次使用反射! 遇到的问题描述: 多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好. 查询原因是因为查询数据的SQL为:to_char(a.applyAmount, ...
- Java 反射 方法调用
在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...
- java反射——方法
大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现.那么什么是反射呢?JAVA反射机制是在运行状 ...
- java反射--方法反射的基本操作
方法的反射 1)如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法. 2)方法反射的操作 method.invoke(对象,参数列表). 代码实例: package com.reflec ...
- Java反射方法总结
1.得到构造器的方法 Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, Constructor[] getConstr ...
- 【译】7. Java反射——私有字段和私有方法
原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...
- Java 反射机制学习资料
Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...
- Java反射——引言
Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...
- 【译】1. Java反射——引言
原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...
随机推荐
- 读论文-电子商务产品推荐的序列推荐系统综述与分类(A Survey and Taxonomy of Sequential Recommender Systems for E-commerce Product Recommendation)
前言 今天读的这篇文章是于2023年发表在"SN Computer Science"上的一篇论文,这篇文章主要对序列推荐系统进行了全面的调查和分类,特别是在电子商务领域的应用.文章 ...
- postman 如何比较两台电脑的脚本是否一样
- SpringBoot集成WebServlet出现自定义单servlet请求失败的问题
一.导言 SpringBoot的真正核心是快速整合以及自动装配,所以在spring家族中springBoot不仅整合了Spring的IOC容器还兼容了WebServlet容器:这使得springBoo ...
- golang interface 转 string、int、float64
interface{} interface{} 接口.interface{} 类型很多人都会混淆.interface{} 类型是没有方法的接口.由于没有 implements 关键字,所以说所有的类型 ...
- 四大AI编程工具组合测评
在当今数字化浪潮中,AI 编程工具如雨后春笋般涌现,极大地提升了编程效率与体验.本文将详细剖析四类 AI 编程工具组合,从开发工具.大模型.插件搭配,到编程能力.费用体系及综合评价,为开发者提供全面 ...
- 手把手教你下载b站视频并生成音频字幕
1.下载b站视频: 可以直接使用https://bilibili.iiilab.com/ 贴进去网址就能下载了 2.提取音频 可以使用 ffmpeg 将音频文件提取出来(ffmpeg直接去官网下载即可 ...
- VMware网络虚拟化介绍(之一)
2014年5月,在我加入VMware三个月之后,我涂鸦了一篇<扒一扒SDN的那些事儿>,当时放言如果阅读量过百就写续篇.后来果然阅读量没过百,也就80多的样子,其中好几份还是我自恋地进去查 ...
- Nginx 配置 HTTPS 完整过程
配置站点使用 https,并且将 http 重定向至 https. 1. nginx 的 ssl 模块安装 查看 nginx 是否安装 http_ssl_module 模块. $ /usr/local ...
- 保姆级教程——手把手教会你如何在Linux上安装Redis
一.Linux系统安装Redis(7.4.0) 注意: 全程是在root底下操作,当然也可以采用sudo 1.1 安装Redis依赖 Redis是基于C语言编写的,因此首先需要安装Redis所需要的g ...
- [源码系列:手写spring] IOC第三节:Bean实例化策略InstantiationStrategy
主要内容 在第二节中AbstractAutowireCapableBeanFactory类中使用class.newInstance()的方式创建实例,仅适用于无参构造器. 大家可以测试一下,将第二节 ...