1.反射
简介
Jdk1.5引入
优点:
提高了代码的灵活性,使java语言从静态语言变为半动态语言
没学反射前创建对象:
先创建类,在类中定义属性,方法,使用new关键字创建该类对象
1.1反射使用场景:
- 使用第三方类库,可以创建其对象,但是不知道对象拥有的属性与方法,如果获取,就可以通过反射获取
- 使用第三方类库,只知道类名,但是不知道类中有什么,可以使用反射进行获取与使用
- 使用第三方类库,只知道类所在的包名与类名可以使用反射对其进行操作
1.2类对象
概念
一个类被jvm加载时,会生成一个类对象
类对象中包含了该类的属性,方法,构造函数,父类,父接口等信息
注意:
一个类只会被jvm加载一次,所以一个类的类对象只有一个
通过new关键字创建出来的对象,称为类的对象,又名实例对象,与类对象不是一个东西
1.2.1获取类对象的方式
方式1:
通过类的实例对象.getclass();
方式2:
通过类名获取;
类名.class
方式3:
使用class类提供的静态方法
Class.forname(“包名.类名”)
1.2.2类对象的常用方法
通过类对象创建该类额实例对象
NewInstance调用的是该类的无参构造
注意:
- 如果该类中没有无参构造函数,name此时将出现NoSuchMethodException
- 如果该类的无参构造函数访问权限不足,此时将出现ILLegalAccessException
获取类的全名称
String getName)()
获取类名
String getSimpleName()
获取类加载器
Class getClassLoader()
获取父类
Class getSuperClass
获取父接口
Class getInterfaces()
获取包
Package getPackage();
方法
getName()获取包名
获取属性
获取类的所有公共属性
Field[ ] getFields();
注意:可以获取到父类的公共属性
获取本类的所有属性
Field[]getDeclaredFields();
注意:只能获取本类的所有属性
获取指定的属性
Filed getDeclaredField(“属性名”);
修改对象的属性值
Void set(对象,修改后的值)
参数1:要修改的对象
参数2:修改后的值
获取构造函数
获取类中所有公共构造函数
Constructor[ ] getConstructors();
获取类中所有构造函数
Constructor[ ] getDeclaredConstructors();
获取类中指定构造函数
Constructor<?> getDeclarsConstructors(获取构造函数的参数列表的类对象列表)
获取方法
获取类中所有公共方法
Method[ ] getMethods();
注意:可以获取到父类提供的公共方法
获取类中所有方法
Method[ ] getDeclaredMethods();
注意:只能获取该类的所有方法
获取类中指定方法
Method getDeclaredMethod(String name,class…p)
参数1:方法名
参数2:该方法形参列表对应的类对象列表
Method 方法对象= 类对象.getDeclaredMethod("test", double.class,String.class,int.class);
获取注解
2.Filed类
常用方法:
修改对象的属性值
Void set(对象,修改后的值)
获取对象的属性值
Object get(对象)
3.Constructor类
常用方法
创建对象
T newInstance(实参列表)
略过访问权限修饰符
Void setAccessible(true)
4.Method类
常用方法:
作用:执行方法
Object invoke (object obj,object…args )
参数:
Obj:执行该方法的对象
Args:实参列表
返回值:
执行的方法的返回值
略过访问权限修饰符
Void setAccessible(true);
Annotation类
5.设计模式
5.1简介
一套被反复使用,多数人知道,经过分类,代码设计经验的总结
设计模式就是解决固定问题的方案
5.2设计模式法则
单一职责:一个方法或类或接口,只干一件事
开闭原则:对扩展开放,对修改关闭
里式替换
依赖倒置
接口隔离
迪米特法则
5.3单例模式
解决的问题
让一个类只能产生一个对象
分类:
饿汗式
步骤:
- 私有构造函数,此时外部无法通过new调用构造函数创建对象
- 在该类中提供一个私有的静态的不可修改的该类对象
- 提供公共静态方法,该方法返回步骤2的对象,
- 以后外部需要该类对象只能使用类名,步骤3提供的静态方法得到
缺点:浪费内存
懒汉式
线程不安全
步骤
- 私有构造函数
- 在该类中声明一个该类对象
- 提供公共静态方法,方法中
- 判断步骤2的对象是否为空,如果为空创建对象,赋值给该属性,在返回该类对象,如果不为空直接返回
缺点:只能应用于单线程情况下
优点:不浪费内存
线程安全
步骤
- 私有构造函数
- 在该类中声明一个该类对象
- 提供公共静态方法,方法中
1.判断步骤2的对象是否为空,如果为空创建对象,赋值给该属性,在返回该类对象,如果不为空直接返回
优点:不浪费内存,线程安全
缺点:在多线程的情况下比饿汗式效率低
静态内部类实现的懒汗式
6.工厂模式
解决的问题:
一个方法只能产生一种对象
例子:
一个家具厂通过制作方法可以制作椅子,桌子,衣柜等
7.枚举
作用:限定值的取值范围
注意:
枚举是一种引用数据类型
枚举变量的值必须是枚举常量
枚举中可以定义普通的属性,方法与私有的构造函数
如果枚举中只有枚举常量,此时可以忽略分号不写,多个枚举常量直接使用逗号隔开
如果枚举中定义了普通属性等,此时枚举常量最后需要使用分号
枚举的使用
声明变量
作为形参
枚举的定义:
访问权限修饰符 enum 枚举名{
枚举常量名1,枚举常量名2…
}