【Java笔记】第17章:反射与其设计模式

在这里插入图片描述

上期回顾: 【Java笔记】第16章:多线程
个人主页:C_GUIQU
归属专栏:Java

在这里插入图片描述


正文

1. 认识反射

1.1 概念

  • 类的对象:通过 new 操作创建的类的实例。
  • 类对象:类加载的产物,封装了类的所有信息(如包名、类名、父类、接口、属性、方法等)。
  • 反射:通过类对象获取类的信息并操作该类的实例。

1.2 获取类对象的方式

  1. 通过对象调用 getClass() 方法

    Student s = new Student();
    Class<?> c1 = s.getClass();
    
  2. 通过 类名.class

    Class<?> c2 = Student.class;
    
  3. 通过 Class.forName("包名.类名")

    Class<?> c3 = Class.forName("test_flect.Student");
    

    注意:需使用全类名(包名+类名),否则会抛出 ClassNotFoundException

1.3 常用方法

  • getName():获取类名。
  • getMethods():获取本类及父类中所有的公开方法。
  • getDeclaredMethods():获取本类的所有方法,包括非公开方法。

1.4 创建类的对象

  • 无参构造
    Object obj = c1.newInstance();
    
  • 有参构造
    Constructor<?> constructor = c3.getConstructor(String.class, Integer.class);
    Object obj = constructor.newInstance("万青", 48);
    

1.5 调用方法

Method method = c3.getDeclaredMethod("test");
method.setAccessible(true);
method.invoke(obj);

1.6 优缺点

  • 优点:提高代码的通用性和灵活性,适合框架底层实现。
  • 缺点:代码可读性较差,复杂且容易打破封装。

2. 反射的设计模式

2.1 单例模式

单例模式保证一个类在 JVM 中只有一个实例。

2.1.1 饿汉式

线程安全,但在类加载时就创建实例,空间利用率低。

class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

2.1.2 懒汉式

线程不安全,空间利用率高。

class SingletonLazy {
    private static SingletonLazy instance;
    private SingletonLazy() {}
    public synchronized static SingletonLazy getInstance() {
        if (instance == null) {
            instance = new SingletonLazy();
        }
        return instance;
    }
}

2.1.3 静态内部类

结合了前两者的优点,线程安全且空间利用率高。

class SingletonInner {
    private SingletonInner() {}
    private static class Holder {
        private static final SingletonInner instance = new SingletonInner();
    }
    public static SingletonInner getInstance() {
        return Holder.instance;
    }
}

2.2 工厂模式

工厂模式用于统一创建对象,通过工厂类生成实例对象。

  • 反射增强工厂:通过反射实现工厂的通用性和灵活性。
class Factory {
    public static Object createInstance(String className) throws Exception {
        Class<?> clazz = Class.forName(className);
        return clazz.newInstance();
    }
}
Object obj = Factory.createInstance("test_flect.Student");

Properties 资源文件读取
Properties 类是 Map 的实现类,支持读取键值对形式的配置文件。

Properties prop = new Properties();
prop.load(new FileInputStream("config.properties"));
String value = prop.getProperty("key");

结语
感谢您的阅读!期待您的一键三连!欢迎指正!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Guiat

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

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

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

打赏作者

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

抵扣说明:

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

余额充值