通过外部文件配置,在不修改源码情况下,来控制程序,也符合设计模式的ocp原则(
不修改源码,且能扩容功能
),这样的需求在框架里特别多。
反射机制
反射机制可以完成的功能
反射相关类
程序加载的三个阶段
Class类对象在堆中,其对应生成的对象也在堆中。
反射优化
反射的优点与缺点
优化方法
xxx.setAccessible(true); //在反射调用方法时,取消访问检查
Class类
基本介绍
public class Class01 {
public static void main(String[] args) throws ClassNotFoundException {
Class a1 = Class.forName("reflection.Car");
Class a2 = Class.forName("reflection.Car");
System.out.println(a1.hashCode()); //1134712904
System.out.println(a2.hashCode()); //1134712904
//hashCode相同,说明Class只被系统创建一次
}
}
常用方法
public class Class01 {
public static void main(String[] args) throws ... {
//1. 类的完整路径
String classAllPath = "reflection.Car";
//2. 获取到Car类 对应的Class对象,<?>表示不确定的Java类型
Class<?> cls = Class.forName(classAllPath);
System.out.println(cls); //显示哪个类的Class对象 class reflection.Car
System.out.println(cls.getClass());//输出cls的运行类型 class java.lang.Class
//3. 得到包名
System.out.println(cls.getPackage().getName()); //reflection
//4. 得到全类名
System.out.println(cls.getName()); //reflection.Car
//5. 通过cls创建对象实例
Car car = (Car)cls.newInstance();
//6. 通过反射获取属性 brand
Field brand = cls.getField("brand"); //宝马
System.out.println(brand.get(car));
}
}
//7. 通过反射给属性赋值
brand.set(car,"奔驰");
System.out.println(brand.get(car));
//8. 得到所有的属性
Field[] fields = cls.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
获取Class对象的方法
//1. Class.forName
String classAllPath = "reflection.Car";
Class<?> cls1 = Class.forName(classAllPath);
System.out.println(cls1);// class reflection.Car
//2. 类名.class
Class cls2 = Car.class;
System.out.println(cls2); //class reflection.Car
//3. 对象.getClass()
Car car = new Car();
Class cls3 = car.getClass();
System.out.println(cls3); //class reflection.Car
//4. 通过类加载器来获取类的Class对象
//(1) 先得到类加载器
ClassLoader classLoader = car.getClass().getClassLoader();
//(2) 通过类加载器得到Class对象
Class cls4 = classLoader.loadClass("reflection.Car");
System.out.println(cls4); //class reflection.Car
//5. 基本数据类型
Class<Integer> integerClass = int.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass); //int
//6. 基本数据类型对应的包装类
Class<Integer> type = Integer.TYPE;
Class<Boolean> type1 = Boolean.TYPE;
System.out.println(type); //int
System.out.println(integerClass.hashCode()); //1766822961
System.out.println(type.hashCode()); //1766822961
哪些类型有Class对象
版权声明:本文为Acc222222原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。