2024年Java最新Java反射-你不得不知道的那点事,卧薪尝胆70天内推入职阿里

本文介绍了Java反射的面试重点,包括如何使用Class对象获取类的方法、属性和构造函数,以及反射在创建对象和单例模式中的应用,同时提到了反射安全机制和可能导致的单例模式漏洞。
摘要由CSDN通过智能技术生成

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 调用某个类的class属性来获取该类对应的class对象

Class clazz = Student.class;

  • 使用class类中的forName()静态方法(最常用|最安全|性能最高)

Class clazz = Class.forName(“类的全路径”);

  • 使用类加载器获取

// Xxx为与需要获取类信息的类同级别的类加载器。类加载器的选择,要符合双亲委派机制

Class<?> clazz = Xxx.class.getClassLoader().loadClass(“类的全路径”);

当我们获得了想要操作的类的Class的对象后,可以通过Class类中的方法获取并查看该类中的方法和属性

try {

// 获取Person的Class对象

Class<?> clazz = Class.forName(“com.liziba.reflect.Person”);

// 获取Person类的所有成员属性信息

Field[] fields = clazz.getDeclaredFields();

for (Field field : fields) {

System.out.println(field);

}

// 获取Person类的所有方法信息

Method[] methods = clazz.getDeclaredMethods();

for (Method method : methods) {

System.out.println(method);

}

// 获取Person类的所有构造方法信息

Constructor<?>[] constructors = clazz.getDeclaredConstructors();

for (Constructor<?> constructor : constructors) {

System.out.println(constructor);

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

7、创建对象的两种方法


  • Class对象的newInstance()

// 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类有默认的空构造器

Person person = (Person)clazz.newInstance();

// newInstance()方法的本质,仍然是下面的情况,只是传入的参数是(Object[])null

try {

return tmpConstructor.newInstance((Object[])null);

} catch (InvocationTargetException e) {

Unsafe.getUnsafe().throwException(e.getTargetException());

return null;

}

  • 调用Constructor的newInstance()

// 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方发来创建Class对象对应类的实例,通过这种方法可以选定指定构造方法创建实例

Constructor<?> constructor = clazz.getConstructor(String.class, int.class, String.class, int.class);

constructor.newInstance(“李子捌”, 1, “深圳宝安”, 23);

8、反射到底慢在哪里


  • 寻找类Class字节码的过程

  • 安全机制的权限校验

  • 可能需要调用native方法时调用JNI接口

// 安全机制校验,Field/Method/Constructor

private void checkMemberAccess(int which, Class<?> caller, boolean checkProxyInterfaces){

final SecurityManager s = System.getSecurityManager();

if (s != null) {

final ClassLoader ccl = ClassLoader.getClassLoader(caller);

final ClassLoader cl = getClassLoader0();

if (which != Member.PUBLIC) {

if (ccl != cl) {

s.checkPermission(SecurityConstants.CHECK_MEMBER_ACCESS_PERMISSION);

}

}

this.checkPackageAccess(ccl, checkProxyInterfaces);

}

}

9、反射单例模式的漏洞


简单单例

public class SingletonFactory {

private volatile static SingletonFactory singletonFactory = null;

private SingletonFactory() {

}

public static SingletonFactory getInstance() {

if(singletonFactory == null) {

synchronized (SingletonFactory.class) {

if(singletonFactory == null) {

singletonFactory = new SingletonFactory();

}

}

}

return singletonFactory;

}

}

反射破坏单例

public class TestReflectBreakSingleInstance {

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

自己的知识深度和广度是很有必要的。

Mybatis源码解析

[外链图片转存中…(img-Yvox71Q9-1714914286680)]

[外链图片转存中…(img-VkxmxJAB-1714914286680)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值