Java反射
时间:2022-07-25
本文章向大家介绍Java反射,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Java反射
反射:框架设计的灵魂 框架:半成品,可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他的对象,这就是反射机制 好处: 1.可以在程序的运行过程中,操作这些对象 2.可以解耦,提高程序的可拓展性
下面我们用一张图来讲述java的反射机制
由图可见将类的各个组成部分封装为一个个对象,成员变量封装为field对象,构造方法封装为con对象,成员方法封装围为method对象
获取Clss对象的三种方式
- Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
- 类名.class:通过类名的属性class获取 * 多用于参数的传递
- 对象.getClass():getClass()方法在Object类中定义着。 * 多用于对象的获取字节码的方式
代码
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> person = Class.forName("Reflect.Person");
System.out.println(person);
Class<Person> personClass = Person.class;
System.out.println(personClass);
Person person1 = new Person();
Class<? extends Person> aClass = person1.getClass();
System.out.println(aClass);
}
}
结果
可见一个类,在一次运行过程中只会被加载一次
那么class对象有什么用呢?
获取功能: 1. 获取成员变量们 * Field[] getFields() :获取所有public修饰的成员变量 * Field getField(String name) 获取指定名称的 public修饰的成员变量
* Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
* Field getDeclaredField(String name)
package Reflect;
import java.lang.reflect.Field;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//获取class对象
Class<Person> personClass = Person.class;
//使用getFields方法获取public修饰的方法
Field[] fields = personClass.getFields();
System.out.println("getFields方法:");
//获取public修饰的成员变量
for (Field field : fields) {
System.out.println(field);
}
System.out.println("getDeclaredFields方法:");
//使用getDeclareFields方法获取全部成员变量
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
}
}
结果:
2. 获取构造方法们
* Constructor<?>[] getConstructors()
* Constructor<T> getConstructor(类<?>... parameterTypes)
* Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* Constructor<?>[] getDeclaredConstructors()
package Reflect;
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//获取class对象
Class<Person> personClass = Person.class;
//获取public 修饰的构造方法
Constructor<?>[] constructors = personClass.getConstructors();
System.out.println("Public修饰的构造方法:");
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
//获取所有构造方法
System.out.println("所有构造方法:");
Constructor<?>[] declaredConstructors = personClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
}
}
结果:
3. 获取成员方法们:
* Method[] getMethods()
* Method getMethod(String name, 类<?>... parameterTypes)
* Method[] getDeclaredMethods()
* Method getDeclaredMethod(String name, 类<?>... parameterTypes)
4. 获取全类名
* String getName()
*
package Reflect;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//获取class对象
Class<Person> personClass = Person.class;
//获取全类名
String name = personClass.getName();
System.out.println(name);
}
}
结果
Field:成员变量 * 操作: 1. 设置值 * void set(Object obj, Object value) 2. 获取值 * get(Object obj)
3. 忽略访问权限修饰符的安全检查
* setAccessible(true):暴力反射
Constructor:构造方法 创建对象: * T newInstance(Object... initargs)
* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取class对象
Class<Person> personClass = Person.class;
Person person = new Person();
Constructor<Person> one = personClass.getConstructor(String.class, int.class);
System.out.println(one);
//构造方法1
System.out.println("构造方法1:");
Person zhangsan = one.newInstance("zhangsan", 11);
System.out.println(zhangsan);
System.out.println("构造方法2:");
Person person2 = personClass.newInstance();
System.out.println(person2);
}
}
结果
Method:方法对象 执行方法: Object invoke(Object obj, Object... args)
获取方法名称:
String getName:获取方法名
以上就是java反射的一些基础知识,如有错误还请各位批评指正,喜欢我的可以点赞收藏,也可以关注呀
- CaseStudy(showcase)布局篇-列表的排放与遮罩
- [Silverlight动画]转向行为 - 追捕行为
- 前端三大框架vue,angular,react大杂烩
- CaseStudy(showcase)布局篇-如何做一个自适应窗口大小的布局
- WCF后续之旅(2): 如何对Channel Layer进行扩展——创建自定义Channel
- [Silverlight动画]转向行为 - 到达行为
- Asp.Net统一前后端提示信息方案
- 人工智能:未来决策制定的机遇与影响
- CaseStudy(showcase)界面篇-导出xaml以及放入Blend的技巧
- [Silverlight动画]转向行为 - 避开行为
- CaseStudy(showcase)界面篇-desing设计界面
- [Silverlight动画]转向行为 - 寻找行为
- 【数字货币】数字黄金
- [Silverlight动画]转向行为 - 转向机车
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Azure内容审查器之羞羞图审查
- Clickhouse简介和性能对比
- Clickhouse创建分布式表以及表引擎介绍
- Azure 内容审查器之文本审查
- Redis中String数据类型原理实现
- Clickhouse分布式集群搭建
- Redis过期策略以及淘汰机制
- 几行代码就可以轻松给你的程序加上进度条
- git禁止在master分支push和commit
- 记录一次mybatis缓存和事务传播行为导致ut挂的排查过程
- appium教程_3.启动appium-server
- appium教程_4.adb常用命令
- Python中的高阶概念属性:五个你应该搞明白的知识点
- 一次奇怪的http状态码改变
- Salesforce LWC学习(二十七) File Upload