1.什么是反射机制?
简单来说,就是可以操作字节码文件,意思就是程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。
本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息
2.反射机制的作用?
在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象
1.通过反射机制访问java对象的属性,方法,构造方法等
2.反射最重要的用途就是开发各种通用框架。比如很多框架(Spring)都是配置化的(比如通过XML文件配置Bean),为了保证框架的通用性,他们可能需要根据配置文件加载不同的类或者对象,调用不同的方法,这个时候就必须使用到反射了,运行时动态加载需要的加载的对象
3.反射机制相关的类在哪个包下?
java.lang.reflect.*
4.反射机制相关的主要的类?
java.lang.Class
java.lang.reflect.Method;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
5.在java中获取Class的三种方式
(1)Object-->getClass
(2)任何数据类型(包括基本的数据类型)都有一个“静态”的class属性
(3)通过class类的静态方法:forName(String className)(最常用)
//第一种方式获取Class对象
Class c = int.class;
Class c = String.class;
//第二种方式获取Class对象
Class c = 对象.getClass;
//第三种方式获取Class对象
Class c = class.forName("完整类名");
注意,在运行期间,一个类,只有一个Class对象产生
6.获取了Class之后,可以调用无参数构造方法来实例化对象
Class c = Class.forName("java.lang.Date");
Object obj = c.newInstance();
一定要注意:
newInstance()底层调用的是该类型的无参构造方法,如果没有这个无参数构造方会出现”实例化异常"。
7.如果你只想让一个类的"静态代码块"执行的话
用Class.forName("该类的类名”);//执行时,类会加载
这样类就加载,类加载的时候,静态代码块执行!!!!!
8.关于获取文件的绝对路径(在任何系统下都适用)
String path = Thread.currentThread().getContextClassLoader().
getResource("写文件的相对路径,但必须在src下").getPath();
String path = Thread.currentThread().getContextClassLoader().
getResource("abc").getPath();//必须保证src下面有abc文件
String path = Thread.currentThread().getContextClassLoader().
getResource("abc/db").getPath();//必须保证src下面有abc目录,abc目录下有db文件
但是该文件要求放在类路径下,换句话说,也就是放到src下面。
9.关于利用 IO+Properties 拿类名的操作
//通过IO流读取文件
try {
FileReader file = new FileReader("Remake_10.31\\classinfo.properties");
//创建属性类对象Map
//Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串
Properties pr = new Properties();
pr.load(file);//load(Reader reader) 参数必须是Reader对象
//关闭流,已经通过load 将流里面的数据加载到pr中了,所以流可以关闭了
file.close();
//通过key获取value
String classname = pr.getProperty("classname");
System.out.println(classname);//即可以通过读配置文件,拿到了类名
运行结果,成功拿到了类名
10.除了上上面那种利用IO +Properties的方法, 还可以利用资源绑定器 快速绑定属性资源文件。但有以下两个要求 1.这个文件必须在src下 2.这个文件必须以.properties结尾。
/*资源绑定器*/
/*只能用于xxx.properties属性配置文件,并且这个文件必须放下类路径下*/
public class ResourceBundleDemo {
public static void main(String[] args) {
ResourceBundle resourceBundle = ResourceBundle.getBundle("db");
//io +properties步骤
//reader
//Properties p = new Properties();
//p.load();
//以上这几步都不需要了
//记住这种方法就行了
String classname = resourceBundle.getString("classname");
System.out.println(classname);
}
}
运行结果:
db.properties在src路径下