我自己之前学习过深度学习相关内容,使用mmdetection时就感受到了这种感觉,就是一整个模型架构只需要修改配置文件的内容就可以瞬间搭建不同的模型、调整不同的训练策略等。java的反射应该和这个类似。
优点 可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑。缺点 使用反射基本是解释执行,对执行速度有影响。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3adYHR8G-1661264188260)(/Users/ymy/Library/Application Support/typora-user-images/image-20220809170240404.png)]](https://1000bd.com/contentImg/2023/06/14/162254298.png)
Class<?> catClass = Class.forName("Reflection.Cat");
Class<?> catClass2 = Class.forName("Reflection.Cat");
System.out.println(catClass.hashCode() + "\n" + catClass2.hashCode());

System.out.println(catClass); // 输出catClass表示的是哪个类
System.out.println(catClass.getClass()); // 输出catClass本身的运行类型-->Class

重点如果你只是希望一个类的静态代码块执行,其它代码一律不执行,你可以使用: Class. forName(“完整类名”); 该方法的执行会导致类加载,类加载时,静态代码块执行。

一定要注意: newInstance ()底层调用的是该类型的无参数构造方法
java.util包下提供了一个资源绑定器,便于获取属性配置文件中的内容。使用以下这种方式的时候,属性配置文件xxx. properties得在
src 目录下。资源绑定器只能綁定xxx. properties文件。并且这个文件必须在src下。文件扩展名也必须是properties
并且在写路径的时候,路径后面的扩展名不能写。
// 配置文件在: src/Reflection/demo.properties
ResourceBundle bundle = ResourceBundle.getBundle("Reflection/demo");
String height = bundle.getString("height");
System.out.println(height);
资源绑定器中还有别的方法很实用!
补充 用以下方法可以获取文件路径,并且很通用
string path = Thread.currentThread().getContextClassLoader().getResource("写相对路径,但是这个相对路径从src出发开始找").getPath
string path = Thread.currentThread().getContextClassLoader().getResource ("abc").getpath() ; //必须保证src下有abc文件
当我们拿到Class了之后,就可以通过Class获取该类的属性字段了。