反射机制
- 反射机制的作用可以同过反射机制来操控字节码文件
- 操作一个类的字节码,首先要获取到这个类的字节吗
- 三种方式
- 1 Class c = Class。foeName(“完整的类名带包名”)
- 2 Class c =对象.getClass()
- 3 Class c 任何类型
反射机制的灵活性
- 代码写一遍,在不改变java源代码的情况下可以做到不同的对象实例化
- 非常之灵活(复合ocp开闭原则:对扩展开放,对修改关闭)
public class ReflectTest01 {
public static void main(String[] args) {
try {
Class c =Class.forName("java.lang.String");
Class c2 =Class.forName("java.util.Date");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//java中如何一个对象都有getClass()
String s = "abc";
Class x =s.getClass();
//x代表String.Class字节码文件 x代表String类型
//System.out.println(c ==x);//true 判断的是内存地址
Class a=String.class;
System.out.println(x==a);//true
//class x和class a的内存地址同时执行String.class
}
}
获取class实例化对象
public class ReflectTest02 {
public static void main(String[] args) {
try {
Class c =Class.forName("java.lang.String");
//newInstance会调用copy的无参构造
Object obj = c.newInstance();
System.out.println(obj);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
public class ReflectTest03 {
public static void main(String[] args) throws Exception{
//通过io流读取属性配置文件
FileReader reader =new FileReader("src/com/powernode/x.properties");
//创建属性类对象
Properties pro =new Properties();//key value 都是String
//加载
pro.load(reader);
reader.close();
//通过key 获取value
String className= pro.getProperty("className");
System.out.println(className);
//通过反射机制实例化对象
Class c = Class.forName(className);
Object obj = c.newInstance();
System.out.println(obj);
}
}