反射机制

发布时间 2023-05-19 23:52:52作者: 22软工冷薄

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系统,它依然可以被找到,很牛逼,提高了程序的耦合性