一 递归

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 递归 反射 正则表达式的更多相关文章

  1. Java:反射

    初识Java反射机制: 从上面的描述可以看出Java的反射机制使得Java语言可以在运行时去认识在编译时并不了解的类/对象的信息,并且能够调用相应的方法或修改属性的值.Java反射机制的核心就是允许在 ...

  2. [java 基础]反射入门

    原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...

  3. JAVA的反射理解

    1----------------------------反射的概念----------------------------------------------- JAVA的反射机制是在运行状态中,对 ...

  4. java的反射

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  5. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  6. 9.JAVA中的正则表达式

    一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ?          #{0,1}-?有一个-或者没有 \\           #表示一个" ...

  7. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  8. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  9. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

随机推荐

  1. 持续集成之Jenkins+Gitlab实现持续集成

    项目使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将git路径存在这里还需要权限认证,否则会出现error  我们 ...

  2. 课时53.video标签(掌握)

    这节课来学习一下html5中新增的标签,我们先来看一下,html5中新增了哪些标签? 打开W3school的网页,点击参考手册中的HTML/HTML5标签,有一个按字母顺序排列的标签,但凡标签后面带有 ...

  3. How to Effectively crack .JAR Files?

    Author: http://www.cnblogs.com/open-coder/p/3763170.html With some external tools, we could crack a ...

  4. iOS/Swift Tips 1

    1.重写hitTest方法,干预iOS事件传递过程 如下所示,view上有一个button,button一半的frame在父类view bounds之外, 按照iOS系统默认的处理逻辑, 如果点击按钮 ...

  5. 三层架构,Struts2,SpringMVC实现原理图

    三层架构,Struts2,SpringMVC实现原理图 三层架构实现原理 Struts2实现原理 SpringMVC实现原理

  6. TinyMCE插件:Filemanager [4.x-6.x] 图片自动添加水印

    上传图片程序(filemanager/upload.php) 在if (!empty($_FILES) && $upload_files)有一个move_uploaded_file() ...

  7. php的基础知识(二)

    7.系统常量: 常量的定义:常量是程序运行的时候是不可以改变的量 定义格式:define(‘常量名字’,‘常量的值’): 注意: ·不能重复定义 ·常量的名字最好用大写字母. ·常量的值只能是标量. ...

  8. Delphi采用接口实现DLL调用

    Delphi使用模块化开发,可以采用DLL或者BPL,两者的区别是BPL只能被同版本的Delphi使用,DLL可以被不同版本和不同开发工具的开发的软件调用. 因此我们的软件大多使用Delphi作为界面 ...

  9. 集合之WeakHashMap

    WeakHashMap 底层数据结构是哈希表结构 依赖于键的数据结构特点 不同于HashMap,该类的键是以弱键的形式存在 当该键成为垃圾对象,会被垃圾回收期空闲的时候回收,那么改键所对应值也会被回收 ...

  10. Flink的部署

    Flink的部署 环境准备:windows7系统,本地连接.如果打开更改适配器设置后没有本地连接,可以通过驱动精灵等软件安装网卡驱动.为了使部署在虚拟机上的服务器可以与物理机进行连通,必须使物理机的网 ...