1.反射机制有什么用?
通过java语言反射机制可以操作字节码文件。
优点类似黑客,可以读和改写字节码文件
2.反射机制相关类都在java.lang.reflect.*;
3.反射机制相关重要类
java.lang.Class代表i字节码文件。
java.lang.reflect.Method代表字节码中方法字节码
java.lang.reflect.Constructor代表字节码中构造方法字节码
java.lang.reflect.Field代表字节码中成员变量字节码(静态变量和实例变量)
4.获取字节码的三种方式:
1.Class c=Class.forName("完整类名带包名")
2.Class c1=对象.getClass();
3.Class c2=任何类型.class;
package Reflect; public class ReflectText01 { //要操作一个字节码首先要找到这个类的字节码,怎么获取java.long.Class实例? // 三种方式 //1.Class c=Class.forName("完整类名带包名") //2.Class c1=对象.getClass(); //3.Class c2=任何类型.class; public static void main(String[] args) { /*Class.forName() 1.静态方法 2.方法的参数是一个字符串 3.完整类名必须带有包名。java.long包也不能忽略。 */
java中每个对象里都有getClass()方法
Class c1=null; Class c2=null; try { c1=Class.forName("完整类名带包名"); int []a=new int[1]; c2=a.getClass(); Class c3=int.class; } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }

指向是都是方法区,存储都都是地址,‘==’


5.1 Object o=a.newInstance();方法

5.反射机制可以创建对象(重要)
那我们为什么不直接new一个对象呢?显然,它一定有存在的道理,它有着很强的耦合性,极大提高了程序的灵活度,遵循ocp原则!---框架
package Reflect; import java.io.FileReader; import java.util.Properties; public class ReflectText02 { public static void main(String[] args) throws Exception{ /*通过IO流读取.properties文件 优点:通过文件存储,不需要再更改代码,提高程序耦合性 */ FileReader reader=new FileReader("D:\\java\\javatext\\text.txt"); //创建属性类对象Map Properties p=new Properties();//(String key,String value)key=value //加载reader p.load(reader); //关闭 reader.close(); //通过key获取value String s=p.getProperty("className"); //通过反射机制实例化对象 Class a=Class.forName(s); Object o=a.newInstance(); System.out.println(o); } }
配置文件如下:

顺便回顾一下配置文件注意事项:


静态代码块在类加载时执行!!!!
package Reflect; public class User {
//静态代码块 static { System.out.println("这是一个静态代码块!!!!!!!!!!"); } User(){ System.out.println("这是一个user类!!!!!!!!!"); } public static void main(String[] args) { try { Class.forName("Reflect.User");//字节码文件 } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }
6.聊聊路径:(重要)

伪代码:

这种方式获取的绝对路径是通用的
这样写,以后文件在类路径下也就是src下的文件都可以被找到,即使更换了路径,即使不用windows系统,它依然可以被找到,很牛逼,提高了程序的耦合性