网站首页 > 技术文章 正文
文章目录
- 前言(先扯几句家常)
- 反射
- 用处
- 优缺点
- 用法
- 简单使用
- 使用对象获取类的构造方法
- 获取成员变量
- 获取成员方法
- 总结
- 结语
前言(先扯几句家常)
个人主张自学,但是也不能忘记了讨论的重要性,但是由于平时不z怎么看CSDN,所以呢我这边搞了一个小圈子,欢迎大家来哦~可以畅所欲言呀——java小圈子
不过CSDN评论区我也会不定时观看的,所以非强制性要求哦
反射
什么是反射?就是Java中可以通过反射,将类的各个组成成分映射成一个个的对象。
好,这是我查看别人的解释。
那么现在就来说说我对反射的理解。
反射:
就是在你只知道一个类名,而且无法查看类的源码(也就是说你对这个类的理解只局限于你知道类名)的时候,可以通过反射来将类中的各个成分调出来,成为一个个对象,可以通过反射了解这个类的成分。如果你不知道类里面都有哪些成分的话,那说明你的基础还不够扎实,推荐你去看看我的类三部曲。
那么这么说还是有点不太容易理解吧。
那就举个例子:
我是一个黑客,有个人叫张三(类),他惹了我,我知道了他的名字(类名),我通过技术手段(反射)人肉到了他的个人消息(各个组成成分)。
这就是反射!
用处
反射可以将加载到JVM中的类的信息加载出来,供我们使用。
反射在框架架构中经常使用,而在日常开发中,并不经常使用。
那么为什么我们还需要学习反射呢?因为我们需要去看别人的框架源码来深入学习,而如果我们对反射不理解的话,就不能理解别人的源码。
优缺点
优点
- 增加程序的灵活性,避免将固有的逻辑程序写死到代码里
- 代码简洁,可读性强,可提高代码的复用率
缺点
- 相较直接调用在量大的情景下反射性能下降
- 存在一些内部暴露和安全隐患
用法
使用反射技术,就不得不提一下Class类,下面我们先看看别人对Class类的说法:
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是Java虚拟机中有N多的实例每个类都有该Class对象。(包括基本数据类型)
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了。
——摘自Java基础之—反射(非常重要)
换句话说,我们所用到的所有类,都是Class类的一个实例化对象。是不是感觉有点难,没事,其实之前我听过一个底层大佬的一句话,感觉受益很多:
每个类都是更抽象的类的对象罢了
而我们现阶段不需要了解那么多,只需要使用Class类中的方法就可以了
简单使用
好了,巴拉巴拉地说了这么多,也该上代码了
- 首先呢,我们先定义一个类class Girl_5_5{ String name; Integer age; Integer ID; public void describe(String name, Integer age, Integer id){ this.ID = id; this.name = name; this.age = age; System.out.printf("我是%s,我的证明是%d,我今年%d岁了", name, id, age); } }
- 我们需要获取Class对象获取Class对象的三种方式Object类(自定义类的默认父类)的getClass();方法类自带的class属性 类名.classs;通过Class类的静态方法:forName(String className)(常用)public class Fanshe { public static void main(String[] args) { Girl_5_5 girl = new Girl_5_5(); //实例化一个对象 //第一种方法,使用所自定义类中的默认父类Object的class方法 Class<? extends Girl_5_5> girlClass = girl.getClass(); //第二种方法 访问静态属性class获取 Class<Girl_5_5> girlClass1 = Girl_5_5.class; //第三种方法 try { Class<?> girlClass2 = Class.forName("com.util.text.基础语法.反射.Girl_5_5"); System.out.println(girlClass+"\n"+girlClass1+"\n"+girlClass2); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } class Girl_5_5{ String name; Integer age; long ID; public void describe(String name, Integer age, long id){ this.ID = id; this.name = name; this.age = age; System.out.printf("我是%s,我的证明是%d,我今年%d岁了", name, id, age); } }
运行结果:
这都是我们的Girl_5_5类对象,我们将这个类,通过反射实例化成了一个Class类的对象,可以通过这个对象调用Class的方法,通过Class的方法可以获得Girl_5_5的构造方法,成员变量等,并将其化为一个一个的对象。
使用对象获取类的构造方法
所有构造方法:girlClass2.getDeclaredConstructors();
所有公有构造方法:girlClass2.getConstructors();
所有公有无参构造方法:girlClass2.getConstructor(null); 这个参数也可以不放
import java.lang.reflect.Constructor;
import java.util.Arrays;
public class Fanshe {
public static void main(String[] args) throws Exception {
Girl_5_5 girl = new Girl_5_5(); //实例化一个对象
//第一种方法,使用所自定义类中的默认父类Object的class方法
Class<? extends Girl_5_5> girlClass = girl.getClass();
//第二种方法 访问静态属性class获取
Class<Girl_5_5> girlClass1 = Girl_5_5.class;
//第三种方法 通过forName方法获取
try {
Class<?> girlClass2 = Class.forName("com.util.text.基础语法.反射.Girl_5_5");
//输出三种方法
System.out.println(girlClass+"\n"+girlClass1+"\n"+girlClass2);
//所有构造方法
String allConstructors = Arrays.toString(girlClass2.getDeclaredConstructors());
//所有共有构造方法
String publicConstructors = Arrays.toString(girlClass2.getConstructors());
//共有无参构造方法
String nullConstructors = Arrays.toString(new Constructor[]{girlClass2.getConstructor(null)});
//输出看看
System.out.println(allConstructors+"\n"+publicConstructors+"\n"+nullConstructors);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Girl_5_5{
String name;
Integer age;
long ID;
public void describe(String name, Integer age, long id){
this.ID = id;
this.name = name;
this.age = age;
System.out.printf("我是%s,我的证明是%d,我今年%d岁了", name, id, age);
}
/**
* 共有有参构造方法
* @param name:提供一个形参
*/
public Girl_5_5(String name){
System.out.println(name+"hello");
}
/**
* 共有无参构造方法
*/
public Girl_5_5(){
}
/**
* 私有有参构造方法
* @param age:提供形参
*/
private Girl_5_5(Integer age){
}
}
运行结果:
获取成员变量
获取所有:girlClass.getDeclaredFields();
获取所有公有:girlClass.getFields();
具体我就不一一举例子了
获取成员方法
获取所有:girlClass.getDeclaredMethods();
获取所有公有:girlClass.getMethods();
总结
反射就是能在你只知道类名的时候,获取调用类的各种组成成分。
- 上一篇: 一种简单快捷的 java 热部署方式
- 下一篇: Java 反编译工具的使用与对比分析
猜你喜欢
- 2025-01-03 Java 关键字之 native 详解
- 2025-01-03 三石说:java中常用的几个类
- 2025-01-03 反射、枚举以及Lambda表达式
- 2025-01-03 Java 新手教程,建议收藏
- 2025-01-03 Java零基础入门,科普Java你应该了解什么
- 2025-01-03 Java 代码执行原理
- 2025-01-03 揭秘双亲委派模型:Java类加载的“幕后英雄”
- 2025-01-03 你知道 Java 中关键字 enum 是一个语法糖吗?反编译枚举类
- 2025-01-03 Java中的枚举,这一篇全了,一些不为人知的干货
- 2025-01-03 Java反编译工具
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)