Cathy学习Java——反射和类的加载

工厂设计模式
工厂方法模式
概述
工厂:就是生产特点产品的
实现方式
1>创建一个抽象工厂类,声明抽象方法
2>写一个具体抽象工厂类的子类,由子类负责对象的创建
优点:后期容易维护,增强了系统的扩展性
缺点:需要额外的编写代码,增加了工作量
简单工厂模式
又叫静态工厂模式,它定义一个具有的工厂类负责创建一些类的实例
特点:一个类负责很多对象的创建
类的加载
类得加载的过程
当程序要使用某个类时,如果类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化
加载::就是指将class文件存入内存,并为之创建一个class对象。任何类被使用时系统都会建立一个class对象
链接:

验证 是否有正确的内部结构,并和其他类协调一致

准备 负责为类的静态成员分配内存,并设置默认初始化

解析 将类的二进制数据中符号的引用替换为直接引用

初始化: 就是给属性赋值
➢类的加载概述
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初化。
①就是指将class文件读入内存, 并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。
连接
①验证是否有正确的内部结构,并和其他类协调一致
②准备负责为类的静态成员分配内存,并设置默认初始化值
③解析将类的二进制数据中的符号引用替换为直接引用
初始化就是我们以前讲过的初始化步骤

➢类加载时机

  1. 创建类的实例
  2. 访问类的静态变量,或者为静态变量赋值
  3. 调用类的静态方法
  4. 初始化某个类的子类
  5. 直接使用java. exe命令来运行某个主类
  6. 使用反射方式来强制创建某个类或接口对应的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 语句

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Casey·Hu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值