14:Java的反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
- 静态加载类:在程序编译期加载;
- 动态加载:在程序的运行期加载;
所有类都是Class类的实例(对象),所有的属性都是Field类的实例,所有的方法都是Method类的实例。
1、类的反射
获取class类对象
// 方法一,通过对象获得Class类类型(创建对象new)
Demo d = new Demo();
Class c1 = d.getClass();
// 方法二,通过类名获得Class类类型
Class c2 = Demo.class;//每个类都有一个隐含的静态属性class
// 方法三,通过动态加载(反射的方法)
Class c3 = null;
try {
c3 = Class.forName("com.oracle.test.Demo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2、获取类的信息
获得类的属性和方法信息(获取方法和属性进行使用)
3、方法的反射(再进行调用方法)
十五、泛型
1、方法的泛型
2、类和接口的泛型
3、通配符
十六、枚举
2、常用方法(进行调用枚举类的固定值)
3、自定义枚举属性和方法
4、EnumSet和EnumMap的用法(进行增加删除枚举值)
十七、注解
可以自定义注解
源码注解:注解只在源码中存在,编译成.class文件就不存在了;
编译时注解:注解在源码和.class文件中都存在;
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解;(运行时注解还起作用)
解析注解 可以调用获取方法或者类的注解值,获取方法或者类的注解值。
十八、配置文件操作
1、XML文件
2、json文件
3、properties文件
三种文件的写入和读取的使用方法
二十、设计模式
1、单例模式
1.1 饿汉模式
1.2 懒汉模式
1.3 区别
- 对象创建的时机不同,一个是类加载时创建对象,另一个是在需要时创建对象;
- 饿汉模式,加载速度比较慢,获得对象速度比较快,是线程安全的;
- 懒汉模式,加载速度比较快,获得对象的速度比较慢,是线程不安全的;
2、工厂模式
概念:把创建对象的过程封装为一个方法,工厂方法模式。
1:发型接口:
public interface IHair {
//更换发型
public void change();
}
2:具体发型实现类(以左偏分为例){具体实现类}
public class LeftHair implements IHair {
@Override
public void change() {
System.out.println("左偏分。。。。。。");
}
}
3:工厂类:
public class HairFactory {
public static IHair getHairByClassKey(String key){
//读取配置文件的内容
Map<String,String> map = new ReaderProp().reader();
try {
Class c = Class.forName(map.get(key));
IHair ih = (IHair) c.newInstance();
return ih;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
4:属性文件
left=com.oracle.test2.LeftHair
right=com.oracle.test2.RightHair
center=com.oracle.test2.CenterHair
5:属性文件读取类:
public class ReaderProp {
//用来读取配置文件信息的方法
public Map<String,String> reader(){
Properties prop = new Properties();
Map<String,String> map = new HashMap<String,String>();
try {
prop.load(new FileInputStream("hair.properties"));
Enumeration en = prop.propertyNames();//获得属性文件中所有键的枚举
while(en.hasMoreElements()){
String key = (String) en.nextElement();
String value = prop.getProperty(key);
map.put(key, value);
}
return map;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
6:客户端实现
IHair ih = HairFactory.getHairByClassKey("left");
ih.change();
工厂创建的流程,嘿嘿嘿!!!
1:创建接口
2:创建实现接口的类(多个)
3:创建工厂类,通过反射(通过读取文件)。返回父类接口对象。
4:客户端使用父类引用子类对象,调用子类的实现的方法,实现多态。