上期回顾: 【Java笔记】第16章:多线程
个人主页:C_GUIQU
归属专栏:Java
目录
正文
1. 认识反射
1.1 概念
- 类的对象:通过
new
操作创建的类的实例。 - 类对象:类加载的产物,封装了类的所有信息(如包名、类名、父类、接口、属性、方法等)。
- 反射:通过类对象获取类的信息并操作该类的实例。
1.2 获取类对象的方式
-
通过对象调用
getClass()
方法:Student s = new Student(); Class<?> c1 = s.getClass();
-
通过
类名.class
:Class<?> c2 = Student.class;
-
通过
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");
结语
感谢您的阅读!期待您的一键三连!欢迎指正!