概述
工厂设计模式
工厂方法模式
概述
工厂:就是生产特点产品的
实现方式
1>创建一个抽象工厂类,声明抽象方法
2>写一个具体抽象工厂类的子类,由子类负责对象的创建
优点:后期容易维护,增强了系统的扩展性
缺点:需要额外的编写代码,增加了工作量
简单工厂模式
又叫静态工厂模式,它定义一个具有的工厂类负责创建一些类的实例
特点:一个类负责很多对象的创建
类的加载
类得加载的过程
当程序要使用某个类时,如果类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化
加载::就是指将class文件存入内存,并为之创建一个class对象。任何类被使用时系统都会建立一个class对象
链接:
验证 是否有正确的内部结构,并和其他类协调一致
准备 负责为类的静态成员分配内存,并设置默认初始化
解析 将类的二进制数据中符号的引用替换为直接引用
初始化: 就是给属性赋值
➢类的加载概述
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初化。
①就是指将class文件读入内存, 并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。
连接
①验证是否有正确的内部结构,并和其他类协调一致
②准备负责为类的静态成员分配内存,并设置默认初始化值
③解析将类的二进制数据中的符号引用替换为直接引用
初始化就是我们以前讲过的初始化步骤
➢类加载时机
- 创建类的实例
- 访问类的静态变量,或者为静态变量赋值
- 调用类的静态方法
- 初始化某个类的子类
- 直接使用java. exe命令来运行某个主类
- 使用反射方式来强制创建某个类或接口对应的java. lang. Class对象
类加载器的概述和分类
➢类加载器的概述
负责将. class文件加载到内存中,并为之生成对应的Class对象。虽然我们不需要关心类加载机制,但是了解这个机制我们
就能更好的理解程序的运行。
➢类加载器的分类
Bootstrap ClassLoader 根类加载器
Extension ClassLoader 扩展类加载器
System ClassLoader 系统类加载器
➢类加载器的作用
Bootstrap ClassLoader 根类加载器
①也被称为引导类加载器,负责Java核心类的加载
②比如System, String等。在JDK中JRE的lib目录下rt. jar文件中
●Extension ClassLoader扩展类加载器
①负责JRE的扩展目录中jar包的加载。
②在JDK中JRE的1ib目录下ext目录
●System ClassLoader 系统类加载器
①负责在JVM启动时加载来自java命令的class文件,以及classpath环境变 量所指
定的jar包和类路径
反射概述
反射概述
① Java反射机制是在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法
②对于任意一个对象,都能通过反射够调用它的任意一个方法和属性
③这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
④要想解剖一个类,必须先要获取到该类的字节码文件对象。
⑤而解剖 使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
➢三种方式
①0bject 类的getClass()方法,判断两个对象是否是同一个字节码文件
②静态属性class,锁对象
③Class类 中静态方法forName(),读取配置文件
通过反射获取参构造方法
1.如果要使用反射,先要获取字节码对象
2.通过字节码对象的getConstructor()可以获取到构造方法对象
3.构造方法对象(Contructor),有个newInstance方法创建这个字节码对象
4.反射是在java.lang.reflect这个包中
5.反射的作用一般是用于写框架(ssh,ssm)
3.6通过反射获取方法并使用
使用要点
1.反射中通过Method类描述方法[ 构造方法: Contructor,字 段:Field ]
2.通过Class 的getMethod可以获取-一个方法
3.通过getDeclaredMethod可以获取私有方法
4.如果要调用私有方法,设置访问权限setAccessible
越过泛型的检查
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//1.声明泛型集合
List<Integer> list=new ArrayList<Integer>();
list.add(110);
//2.通过反射往集合里添加字符串
//2.1获取字节码对象(Class)
Class clz=list.getClass();
//2.2通过反射获取方法
clz.getMethod("add",Object.class);
Method method=clz.getMethod("add",Object.class);
//2.3 调用方法
method.invoke(list,"hkx");
System.out.println(list);
}
写一个通用的方法来设置对象属性
Demo1类
public class Demo1 {
public static void main(String[] args) throws Exception {
//练习:写一个通用方法,设置对象的属性值
//通过反射给私有属性赋值
Teacher teacher=new Teacher();
//
test1(teacher);
Tool.SetFieldValues(teacher,"name","hkx");
Tool.SetFieldValues(teacher,"homntown","hkx");
Tool.SetFieldValues(teacher,"height",180.0);
System.out.println(teacher);
}
private static void test1(Teacher teacher) throws NoSuchFieldException, IllegalAccessException {
//1.获取字节码
Class clz=teacher.getClass();
//2.获取属性Field
Field field1=clz.getDeclaredField("name");
Field field2=clz.getDeclaredField("homntown");
Field field3=clz.getDeclaredField("height");
//3.设置权限
field1.setAccessible(true);
field2.setAccessible(true);
field3.setAccessible(true);
//4.设置属性
field1.set(teacher,"hkx");
field2.set(teacher,"涿州");
field3.set(teacher,177.0);
}
}
public class Tool {
/**
* 通过反射给属性赋值
* @param fieldName 要赋值的属性名
* @param fieldValue 要赋值的属性值
* @param obj 需要赋值的对象
* */
public static void SetFieldValues(Object obj,String fieldName,Object fieldValue) throws Exception {
//1.获取字节码
Class clz=obj.getClass();
//2.获取属性Field
Field field1=clz.getDeclaredField(fieldName);
//3.设置权限
field1.setAccessible(true);
//4.设置属性
field1.set(obj,fieldValue);
}
public static void main(String[] args) {
}
}
反射:用于获取类的方法和属性
使用要点:
1.如果要使用反射,要先获取字节码对象
2.通过字节码对象的getConstructor()可以获取构造方法对象
3.构造方法对象(Constructor),有个newInstance方法创建这个字节码对象
4.反射是在java.lang.reflect这个包中
■枚举类的常见方法
■
int ordinal()
■
int compareTo(E o)
String name ()
■String toString ()
T value0f (Class type, String name)通 过字节码对象获取枚举对象
■
values(L此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便
■JDK7的六个新特性回顾和讲解|
A:二进制字面量
B:数字字面量可以出现下划线
C:switch语句可以用字符串
D:泛型简化,菱形泛型
E:异常的多个catch合并,每个异常用或|
F: try with-resources 语句
最后
以上就是粗犷煎蛋为你收集整理的Cathy学习Java——反射和类的加载的全部内容,希望文章能够帮你解决Cathy学习Java——反射和类的加载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复