Java 递归 反射 正则表达式
一 递归
1. 就是函数自身调用自身 (就是在栈内存中不断的加载同一个函数)
2. 什么时候用递归呢?
当一个功能被重复使用 而每一次使用该功能时的参数不确定 都由上次的功能元素结果来确定
简单说: 功能内部又用到该功能 但是传递的参数值不确定(每次功能参与运算的未知内容不确定)
3. 递归的注意事项
1> 一定要定义递归的条件
2> 递归的次数不要过多 容易出现 StackOverflowError 栈内存溢出错误
二 反射
其实就是动态加载一个指定的类 并获取该类中的所有的内容 而且将字节码文件封装成对象 并将字节码文件中的内容都封装成对象 这样便于操作这些成员 简单说: 反射技术可以对一个类进行解剖
1. 反射的好处
大大的增强了程序的扩展性
2. 反射的基本步骤
1> 获得Class对象 就是获取到指定的名称的字节码文件对象
2> 实例化对象 获得类的属性, 方法或构造函数
3> 访问属性, 调用方法, 调用构造函数创建对象
3. 获取这个Class对象 有三种方式
1> 通过每个对象都具备的方法getClass来获取 弊端: 必须要创建该类对象 才可以调用getClass方法(不利于程序的扩展 因为都需要在程序使用具体的类来完成)
2> 每一个数据类型(基本数据类型和引用数据类型) 都有一个静态的属性class 弊端: 必须要先明确该类(不利于程序的扩展 因为都需要在程序使用具体的类来完成)
3> 使用的Class类中的方法 (静态的forName方法) 指定什么类名 就获取什么类字节码文件对象 这种方式的扩展性最强 只要将类名的字符串传入即可
// 根据给定的类名来获得 用于类加载
String classname = "cn.itcast.reflect.Person"; // 来自配置文件
Class clazz = Class.forName(classname); // 此对象代表Person.class
// 如果拿到了对象 不知道是什么类型 用于获得对象的类型
Object obj = new Person();
Class clazz1 = obj.getClass(); // 获得对象具体的类型
// 如果是明确地获得某个类的Class对象 主要用于传参
Class clazz2 = Person.class;
4. 反射的用法
1> 需要获得java类的各个组成部分 首先需要获得类的Class对象 获得Class对象的三种方式
Class.forName(classname) ---> 用于做类加载
obj.getClass() ---> 用于获得对象的类型
类名.class ---> 用于获得指定的类型 传参用
2> 反射类的成员方法
Class clazz = Person.class;
Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();
3> 反射类的构造函数
Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2, ...});
con.newInstance(params...);
4> 反射类的属性
Field field = clazz.getField(fieldName);
field.setAccessible(true);
field.setObject(value);
5. 获取了字节码文件对象后 最终都需要创建指定类的对象
创建对象的两种方式(其实就是对象在进行实例化时的初始化方式)
1> 调用空参数的构造函数: 使用了Class类中的newInstance()方法
2> 调用带参数的构造函数: 先要获取指定参数列表的构造函数对象 然后通过该构造函数的对象的newInstance(实际参数) 进行对象的初始化
综上所述 第二种方式 必须要先明确具体的构造函数的参数类型 不便于扩展 所以一般情况下 被反射的类 内部通常都会提供一个公有的空参数的构造函数
// 如何生成获取到字节码文件对象的实例对象
Class clazz = Class.forName("com.huangyi.domain.Person"); //类加载
// 直接获得指定的类型
clazz = Person.class;
// 根据对象获得类型
Object obj = new Person("zhangsan", 19);
clazz = obj.getClass();
Object obj = clazz.newInstance(); //该实例化对象的方法调用就是指定类中的空参数构造函数 给创建对象进行初始化 当指定类中没有空参数构造函数时 使用method_2();
public static void method_2() throws Exception {
Class clazz = Class.forName("com.huangyi.domain.Person");
//既然类中没有空参数的构造函数 那么只有获取指定参数的构造函数 用该函数来进行实例化
//获取一个带参数的构造器
Constructor constructor = clazz.getConstructor(String.class, int.class);
//想要对对象进行初始化 使用构造器的方法newInstance();
Object obj = constructor.newInstance("zhagnsan", 30);
//获取所有构造器
Constructor[] constructors = clazz.getConstructors(); //只包含公共的
constructors = clazz.getDeclaredConstructors(); //包含私有的
for(Constructor con : constructors) {
System.out.println(con);
}
}
6. 反射指定类中的方法
//获取类中所有的方法
public static void method_1() throws Exception {
Class clazz = Class.forName("com.huangyi.domain.Person");
Method[] methods = clazz.getMethods(); //获取的是该类中的公有方法和父类中的公有方法
methods = clazz.getDeclaredMethods(); //获取本类中的方法 包含私有方法
for(Method method : methods) {
System.out.println(method);
}
} //获取指定方法
public static void method_2() throws Exception {
Class clazz = Class.forName("com.huangyi.domain.Person");
//获取指定名称的方法
Method method = clazz.getMethod("show", int.class, String.class);
//想要运行指定方法 当然是方法对象最清楚 为了让方法运行 调用方法对象的invoke方法即可 但是方法运行必须要明确所属的对象和具体的实际参数
Object obj = clazz.newInstance();
method.invoke(obj, 39, "hehehe"); //执行一个方法
} //想要运行私有方法
public static void method_3() throws Exception {
Class clazz = Class.forName("com.huangyi.domain.Person");
//想要获取私有方法 必须用getDeclearMethod();
Method method = clazz.getDeclaredMethod("method", null);
// 私有方法不能直接访问 因为权限不够 非要访问 可以通过暴力的方式
method.setAccessible(true); //一般很少用 因为私有就是隐藏起来 所以尽量不要访问
} //反射静态方法
public static void method_4() throws Exception {
Class clazz = Class.forName("com.huangyi.domain.Person");
Method method = clazz.getMethod("function", null);
method.invoke(null, null);
}
三 正则表达式
其实是用来操作字符串的一些规则 (其实更多是用正则解决字符串操作的问题)
1. 好处: 正则的出现 对字符串的复杂操作变得更为简单
2. 特点: 将对字符串操作的代码用一些符号来表示 只要使用了指定符号 就可以调用底层的代码对字符串进行操作 符号的出现 简化了代码的书写
3. 弊端:符号的出现虽然简化了书写 但是却降低了阅读性
4. 常见操作
1> 匹配 其实用的就是String类中的matches方法
String reg = "[1-9][0-9]{4,14}";
boolean b = qq.matches(reg); //将正则和字符串关联对字符串进行匹配
2> 切割 其实用的就是String类中的split方法
3> 替换 其实用的就是String类中的replaceAll();
4> 获取
a. 先要将正则表达式编译成正则对象 使用的是Pattern中静态方法 compile(regex);
b. 通过Pattern对象获取Matcher对象
c. 使用Matcher对象中的方法即可对字符串进行各种正则操作
5. 常用符号
Java 递归 反射 正则表达式的更多相关文章
- Java:反射
初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...
- [java 基础]反射入门
原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...
- JAVA的反射理解
1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- 9.JAVA中的正则表达式
一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ? #{0,1}-?有一个-或者没有 \\ #表示一个" ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
- java的反射机制
一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...
- Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
一.Java的反射机制 每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图: 其中
随机推荐
- halcon 数字转字符串实现循环读取图片
1.将字符转换为数字 tuple_number (StringImageIndex,IntImageIndex) 2.将数字转换为字符 tuple_string (IntImageIndex, '0' ...
- Spring - 父容器与子容器
一.Spring容器(父容器) 1.Mapper代理对象 2.Service对象 二.Springmvc(前端控制器)(子容器) Controller对象 1.标准的配置是这样的:Con ...
- react系列(三)组件间通信
组件间通信 React的基本组件元素是一个个组件,组件之间可能存在关联.组合等关系.不同的组件之间,经常会发生数据传递或者交换,我们称之为组件间通信. 根据传递的复杂程度,可以分为三种情况: 父子间通 ...
- 使用canvas输出base64_url
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- REST解惑
本文是「架构风格:你真的懂REST吗?」的补充! REST全称是Representational State Transfer,目前普遍接受的中文翻译为「表述性状态转移」! 即使翻译过来了,你依然有一 ...
- 身份认证系统(一)单WEB应用的身份认证
身份认证技术,也就是所谓的登录功能,是现代WEB系统最常见的功能之一.本系列文章就试图为大家详细的介绍身份认证技术. Basic认证模式 Basic认证模式是较早被广泛应用的一种HTTP标准提供的认证 ...
- oracle 的replace()
1.查询所有员工的姓名,如果包含字母s,则用S替换. 2.查询所有员工姓名的前三个字符.
- 由Oracle 11g SYSAUX 和 SYSTEM 表空间回收引发的联想
0x00--目的 整理一下以前一个SYSTEM表空间和SYSAUX表空间使用率达到99%上限的处理思路和相关知识点,好记性不如烂笔头 0x01--表空间使用率现状 通过查询可得知目前表空间使用情况如下 ...
- oracle计算某个表中数据所占表空间的比例
要求计算某个表所占表空间的大小,网上查了些资料用到了oracle的3个视图.具体sql如下 select segment_name as tablename, round(bytes / (selec ...
- 上白泽慧音(tarjan,图的染色)
题目描述 在幻想乡,上白泽慧音是以知识渊博闻名的老师.春雪异变导致人间之里的很多道路都被大雪堵塞,使有的学生不能顺利地到达慧音所在的村庄.因此慧音决定换一个能够聚集最多人数的村庄作为新的教学地点.人间 ...