反射机制

Posted lengbo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射机制相关的知识,希望对你有一定的参考价值。

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

SpringMVC为啥是基于反射机制

参考技术A 我们知道,spring中大量使用了反射机制,那么究竟是什么地方使用了呢?就从源头说起吧。

一 反射源头Class类
对类的概念我们已经非常熟悉了。比如可以有Student这个类,Person这个类。但是我们要知道,有一个叫Class的类,它是反射的源头。

正常方式:通过完整的类名—>通过new实例化—>取得实例化对象
反射方式:实例化对象—>getClass()方法—>通过完整的类名

以上是关于反射机制的主要内容,如果未能解决你的问题,请参考以下文章

Java反射机制详解

反射机制在java中如何做呀?

Java Reflection (JAVA反射)机制详解

java反射机制

[转]Java反射机制详解

java 中反射机制和内省机制的区别是啥?