java(Day24)-----反射,枚举,设计模式

1.反射

简介

Jdk1.5引入

优点:

提高了代码的灵活性,使java语言从静态语言变为半动态语言

没学反射前创建对象:

先创建类,在类中定义属性,方法,使用new关键字创建该类对象

1.1反射使用场景:

  1. 使用第三方类库,可以创建其对象,但是不知道对象拥有的属性与方法,如果获取,就可以通过反射获取
  2. 使用第三方类库,只知道类名,但是不知道类中有什么,可以使用反射进行获取与使用
  3. 使用第三方类库,只知道类所在的包名与类名可以使用反射对其进行操作

1.2类对象

概念

一个类被jvm加载时,会生成一个类对象

类对象中包含了该类的属性,方法,构造函数,父类,父接口等信息

注意:

一个类只会被jvm加载一次,所以一个类的类对象只有一个

通过new关键字创建出来的对象,称为类的对象,又名实例对象,与类对象不是一个东西

1.2.1获取类对象的方式

方式1:

通过类的实例对象.getclass();

方式2:

通过类名获取;

类名.class

方式3:

使用class类提供的静态方法

Class.forname(“包名.类名”)

1.2.2类对象的常用方法

通过类对象创建该类额实例对象

NewInstance调用的是该类的无参构造

注意:

  1.  如果该类中没有无参构造函数,name此时将出现NoSuchMethodException
  2. 如果该类的无参构造函数访问权限不足,此时将出现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单例模式

解决的问题

让一个类只能产生一个对象

分类:

饿汗式

步骤:

  1. 私有构造函数,此时外部无法通过new调用构造函数创建对象
  2. 在该类中提供一个私有的静态的不可修改的该类对象
  3. 提供公共静态方法,该方法返回步骤2的对象,
  4. 以后外部需要该类对象只能使用类名,步骤3提供的静态方法得到

    缺点:浪费内存

懒汉式

线程不安全

步骤

  1. 私有构造函数
  2. 在该类中声明一个该类对象
  3. 提供公共静态方法,方法中
  1. 判断步骤2的对象是否为空,如果为空创建对象,赋值给该属性,在返回该类对象,如果不为空直接返回

缺点:只能应用于单线程情况下

优点:不浪费内存

线程安全

步骤

  1. 私有构造函数
  2. 在该类中声明一个该类对象
  3. 提供公共静态方法,方法中

1.判断步骤2的对象是否为空,如果为空创建对象,赋值给该属性,在返回该类对象,如果不为空直接返回

优点:不浪费内存,线程安全

缺点:在多线程的情况下比饿汗式效率低

静态内部类实现的懒汗式

6.工厂模式

解决的问题:

一个方法只能产生一种对象

例子:

一个家具厂通过制作方法可以制作椅子,桌子,衣柜等

7.枚举

作用:限定值的取值范围

注意:

枚举是一种引用数据类型

枚举变量的值必须是枚举常量

枚举中可以定义普通的属性,方法与私有的构造函数

如果枚举中只有枚举常量,此时可以忽略分号不写,多个枚举常量直接使用逗号隔开

如果枚举中定义了普通属性等,此时枚举常量最后需要使用分号

枚举的使用

声明变量

作为形参

枚举的定义:

访问权限修饰符 enum 枚举名{

枚举常量名1,枚举常量名2…

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值