一 递归

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. Windows 10推送的锁屏壁纸保存方法

    Windows 10推送的锁屏壁纸保存方法 工作中使用的系统为Windows 10,锁屏时显示的壁纸很漂亮,并且每天都会更新,有几张特别喜欢,于是就想这些壁纸到底保存在哪里呢?经过一番摸索,终于搞明白 ...

  2. python调用对象属性出错:AttributeError: 'function' object has no attribute '_name_'

    出错如下图所示: 原来是因为把__name__写成_name_, 下图为正确结果:

  3. C# abstract,virtual 修饰符

    abstract(抽象):该abstract修饰符指示要修改的东西有缺失或不完整的实现.abstract修饰符可以与类,方法,属性,索引器和事件一起使用.abstract在类声明中使用修饰符来指示类仅 ...

  4. 微信小程序新版用户授权方式处理

    最新更新(2018-12-27): 最近做了改版,做成默认进来就是首页,然后去判断有没有用户信息,没有的话再去判断用没授权过,如果授权过直接自动去获取,没有的话再跳转到授权页面.因为用户授权主要就是针 ...

  5. 协作开发中常用的Git命令小结

    先提一下最基础的git命令用法: git clone   从远端克隆到本地仓库 git add . (注意add和. 之间有一个空格)将全部改动添加到暂存区 git checkout xxx 撤销更改 ...

  6. Zabbix——自动发现

    前提条件: Zabbix版本为4.0 固定网段寻找网络设备,并添加组.添加模板.添加proxy. 设置完毕,等待~~ 如果没有问题,将会直接出现在host中.

  7. Linux 学习第四天

    Linux学习第四天 一.常用命令 1.tar  (压缩.解压) A.添加压缩包  tar czvf 压缩包名称.tar.gz 源文件 B.添加压缩包  tar cjvf 压缩包名称.tar.bz2 ...

  8. ACM 2003~2005

    ACM 2003 求实数的绝对值 import java.util.Scanner; public class Lengxc { public static void main(String[] ar ...

  9. 利用tornado使请求实现异步非阻塞

    基本IO模型 网上搜了很多关于同步异步,阻塞非阻塞的说法,理解还是不能很透彻,有必要买书看下. 参考:使用异步 I/O 大大提高应用程序的性能 怎样理解阻塞非阻塞与同步异步的区别? 同步和异步:主要关 ...

  10. C++ & java小结

    JAVA类: 每个类都属于一个包,private成员:只有该类可以访问,子类不能访问 Public:其他类可以访问 Protected: 只有本包内的类可以访问 如果在声明class时不加public ...