JavaSE-反射和设计模式

一、反射
1.相关概念
(1) 类的对象:基于定义好的一个类,创建该类的实例,即利用 new 创建的实例就为类的对象。
(2) 类对象:类加载的产物,封装了一个类的所有信息(包名、类名、父类、接口、属性、方法、构造方法)。
(3) 反射:通过反射可以获取一个类的 类对象,从而获取该类的信息,直接通过类对象进行一系列操作。
2.通过反射技术获取类对象
(1) 借助 Object类中 getClass()方法,通过 类的对象 获取 类对象:
Student s = new Student (); // 类的对象
Class c1 = s.getClass(); // 类对象
(2) 通过 类名.class 直接获取类对象:
Class c2 = 类名.class;
例如: Class c2 = Student.class;
(3) 通过 Class 类中静态方法 forName(“包名.类名”) ;
Class c3 = Class.forName(“test_flect.Student”);
注意:参数需要 包名.类名 ,被称为权限类名、全类名。
如果只给定了类名,则运行报错,错误信息为:java.lang.ClassNotFoundException(类找不到异常)
补充:类加载的时机。
(1) 第一次创建该类对象
(2) 第一次使用该类的静态成员(静态属性和静态方法)
(3) 子类类加载会导致其父类先进行类加载。
(4) 通过反射获取类对象,会导致类进行类加载
3.常用的方法
(1) getName():获取类名
(2) Method[] getMethods():获取本类+父类中所有公开方法
(3) Method[] getDeclaredMethods():获取自身所有方法,包含非公开的方法。
(4) 通过 类对象 创建 类的对象:

Class c = Class.forName("test_flect.Student");// 类对象
Object obj=c.newInstance(); // 类对象 获取 类的对象

注意:Class类中 newInstance()方法,获取类的对象,默认调用无参数的构造方法。
所以开发时,对于封装的实体类,建议提供无参数的构造方法。
没有提供对应构造方法,创建对象时,报错信息为:java.lang.InstantiationException
(5) 通过有参数的构造方法获取类的对象:

// 获取 类对象
Class c= Class.forName("test_flect.Student");
// 获取有参数的构造方法
Constructor constructor = c.getConstructor(String.class,Integer.class);
// 通过有参数的构造方法获取 类的对象
Object o = constructor.newInstance("万青",48);
System.out.println(o);

(6) 调用某个方法:

Method m = c.getDeclaredMethod("test");
m.setAccessible(true);
m.invoke(o);

4.反射的优缺点
(1) 缺点:可读性差,代码繁琐,打破封装。
(2) 优点:可以使代码更加通用和灵活。通常用于底层架构,例如:框架等。
二、设计模式
1.设计模式:一套被反复使用,多人知晓,并分门别类的编目的一套代码经验总结。
2.适配器模式
3.单例设计模式:常见的一种开发设计模式,在Java应用程序中,必须保证JVM内部仅存在该类的一个实例对象。
(1) 第一种实现方式:饿汉式

// 第一种实现模式:饿汉式
class ClassA{
	private static final ClassA ca = new ClassA();
	private ClassA(){}
// 提供
public static ClassA getInstance(){
	return ca;
	}
}

优点:线程并发效率高
缺点:空间利用率较低
(2) 第二种实现方式:懒汉式

// 第二种实现方式:懒汉式
class ClassB{
	private static ClassB cb ;
	private ClassB(){}
	public synchronized static ClassB getInstance(){
		if(cb == null){
			cb = new ClassB();
		}
		return cb;
	}
}

优点:空间利用率较高
缺点:线程并发效率低
(3) 基于前两种的优缺点,提供第三种方式:

// 第三实现方式:
class ClassC{
	private ClassC(){}
	private static class Inner{
		final static ClassC c= new ClassC();
	}
	public static ClassC getIntsance(){
		return Inner.c;
	}
}

4.工厂设计模式
(1) 工厂设计模式:用于解决程序中对象创建的问题,一个工厂的作用在于完成对象的创建。
(2) 开发时,通常借助反射的技术使工厂通用、灵活。
(3) 扩充Properties:是 Hashtable的子类,即Map的实现类
a. Properties: 键和值,默认为String类型,创建该类对象时,不要添加泛型。
b. load(InputStream in) / load(Reader in):自动将流指向文件内容进行加载,一行代表一个集合元素,自动以"=" 、":"进行拆分,符号 左侧作为键的内容,右侧作为值的内容
c. String getProperty(String key):通过键获取对应的值

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值