当前位置:网站首页>通过反射获取Class对象的四种方式
通过反射获取Class对象的四种方式
2022-08-05 05:21:00 【洒家肉山大魔王】
Java反射机制
反射:通过反射我们可以获取任意一个类的所有属性和方法,还可以调用这些方法和属性。
反射的优缺点
优点 :可以让代码更加灵活、为各种框架提供开箱即用的功能提供了便利
缺点 :让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。
比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。
另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。
如果我们动态获取到这些信息,我们需要依靠 Class 对象。Class 类对象将一个类的方法、变量等信息告诉运行的程序。
四种获取 Class 对象的方式
通过
Class.forName()
传入类的全路径获取通过对象实例instance.getClass()获取
通过类加载器ClassLoader.loadClass()根据类的全路径获取
通过具体的实例对象获取
举个栗子
/**
* 通过反射获取Class对象的4中方式
*/
@Test
public void reflectGetMethod_Test() {
try {
String classPath = "com.hl.magic.items.day20.reflection.ReflectiveDemo";
Class<?> forName = Class.forName(classPath);
LOGGER.debug("[1]根据类全路径获取当前类的路径: {}", forName.getName());
String name = ReflectiveDemo.class.getName();
LOGGER.debug("[2]-根据类对象来获取当前类的路径: {}", name);
ReflectiveDemo reflectiveDemo = new ReflectiveDemo();
Class<? extends ReflectiveDemo> aClass = reflectiveDemo.getClass();
LOGGER.debug("[3]根据对象实例获取当前类的路径: {}", aClass.getName());
Class<?> aClass1 = ClassLoader.getSystemClassLoader().loadClass(classPath);
LOGGER.debug("[4]根据类加载器获取当前类的路径: {}", aClass1.getName());
// 根据类的path获取对应的属性
ReflectiveDemo reflectiveDemo1 = (ReflectiveDemo) forName.newInstance();
String userName = reflectiveDemo1.getUserName();
LOGGER.debug("获取反射对象的属性 : [{}]", userName);
} catch ( ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
输出:
[main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [1]根据类全路径获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
[main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [2]-根据类对象来获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
[main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [3]根据对象实例获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
[main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - [4]根据类加载器获取当前类的路径: com.hl.magic.items.day20.reflection.ReflectiveDemo
[main] DEBUG com.hl.magic.items.day20.reflection.ReflectiveDemo - 获取反射对象的属性 : [小明]
通过类加载器获取 Class 对象不会进行初始化,意味着不进行包括初始化等一系列步骤,静态代码块和静态对象不会得到执行。
边栏推荐
猜你喜欢
账号与权限管理
Hugo builds a personal blog
Configuration of TensorFlow ObjecDetectionAPI under Anaconda3 of win10 system
The highlight moment of operation and maintenance starts with intelligence
Getting Started Document 07 Staged Output
入门文档10 资源映射
In-depth Zabbix user guide - from the green boy
入门文档08 条件插件
OpenCV3.0 is compatible with VS2010 and VS2013
LinkSLA insists that users come first and creates a sustainable operation and maintenance service plan
随机推荐
逻辑卷创建
js dynamically get screen width and height
OpenCV3.0 is compatible with VS2010 and VS2013
lvm logical volume and disk quota
ACL 和NAT
js动态获取屏幕宽高度
Spark source code - task submission process - 4-container to start executor
Getting Started Documentation 12 webserve + Hot Updates
入门文档01 series按顺序执行
Remembering my first CCF-A conference paper | After six rejections, my paper is finally accepted, yay!
[Pytorch study notes] 8. How to use WeightedRandomSampler (weight sampler) when the training category is unbalanced data
The Servlet to jump to the JSP page, forwarding and redirection
VLAN介绍与实验
Hard Disk Partitioning and Permanent Mounting
[Day1] VMware software installation
[Day8] (Super detailed steps) Use LVM to expand capacity
The spark operator - repartition operator
单臂路由与三成交换机
账号与权限管理
7 steps to complete cloud monitoring