反射机制
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()方法—>通过完整的类名
以上是关于反射机制的主要内容,如果未能解决你的问题,请参考以下文章