总结
在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。
- 调用某个类的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();
}
- 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);
-
寻找类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);
}
}
简单单例
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源码解析
自己的知识深度和广度是很有必要的。
Mybatis源码解析
[外链图片转存中…(img-Yvox71Q9-1714914286680)]
[外链图片转存中…(img-VkxmxJAB-1714914286680)]