首先看看Class 的声明:
public final class Class implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement
Final 的,而且支持泛型,实现了某些接口。
/** * Instances of the class {@code Class} represent classes and * interfaces in a running Java application. An enum is a kind of * class and an annotation is a kind of interface. Every array also * belongs to a class that is reflected as a {@code Class} object * that is shared by all arrays with the same element type and number * of dimensions. The primitive Java types ({@code boolean}, * {@code byte}, {@code char}, {@code short}, * {@code int}, {@code long}, {@code float}, and * {@code double}), and the keyword {@code void} are also * represented as {@code Class} objects. */
通过注释可以看到,主要有这么几类。
接口, 枚举,注解,数组,java基本类型 都可以通过Class 间接得到。
/* * Constructor. Only the Java Virtual Machine creates Class * objects. */ private Class() {}
也就是说一般不能人为的实例化Class实例。
public String toString() { return (isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName(); }
toString 方法:
返回值:interface, class 或者是空串“”。java基本类型 返回值只有类型,不存在具体包名。
public static Class<?> forName(String className) throws ClassNotFoundException { return forName0(className, true, ClassLoader.getCallerClassLoader()); }
用于实例化某个JVM上的Class,ClassLoader.getCallerClassLoader() 返回调用该方法的ClassLoader。
在看看它的重载方法:
public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException { if (loader == null) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { ClassLoader ccl = ClassLoader.getCallerClassLoader(); if (ccl != null) { sm.checkPermission( SecurityConstants.GET_CLASSLOADER_PERMISSION); } } } return forName0(name, initialize, loader); }
只是增加了security 检查,以及设置initialize 参数的能力。
这两个方法最终都调用了一个native 方法
private static native Class<?> forName0(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException;
在看看newInstate 方法
public T newInstance() throws InstantiationException, IllegalAccessException {// 检查该构造方法是不是public的, 如果是就直接调用newInstance0 if (System.getSecurityManager() != null) { checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader()); } return newInstance0(); }
private T newInstance0() throws InstantiationException, IllegalAccessException { // NOTE: the following code may not be strictly correct under // the current Java memory model. // Constructor lookup 检查该类不是Class 类,因为Class类只能有JVM实例化。 if (cachedConstructor == null) { if (this == Class.class) { throw new IllegalAccessException( "Can not call newInstance() on the Class for java.lang.Class" ); } try { //设置构造方法的参数为空数组,这就是而为什么用newInstance实例化类需要有一个为空的构造方法的原因。 Class<?>[] empty = {}; //获取构造参数为空的,构造方法 final Constructor<T> c = getConstructor0(empty, Member.DECLARED); //下面都是做一些security 检查和access设置 // Disable accessibility checks on the constructor // since we have to do the security check here anyway // (the stack depth is wrong for the Constructor's // security check to work) java.security.AccessController.doPrivileged( new java.security.PrivilegedAction<Void>() { public Void run() { c.setAccessible(true); return null; } }); cachedConstructor = c; } catch (NoSuchMethodException e) { throw new InstantiationException(getName()); } } Constructor<T> tmpConstructor = cachedConstructor; // Security check (same as in java.lang.reflect.Constructor) int modifiers = tmpConstructor.getModifiers(); if (!Reflection.quickCheckMemberAccess(this, modifiers)) { Class<?> caller = Reflection.getCallerClass(3); if (newInstanceCallerCache != caller) { Reflection.ensureMemberAccess(caller, this, null, modifiers); newInstanceCallerCache = caller; } } // Run constructor try {//实例化相应的独享 return tmpConstructor.newInstance((Object[])null); } catch (InvocationTargetException e) { Unsafe.getUnsafe().throwException(e.getTargetException()); // Not reached return null; } }
/** * Determines if the specified {@code Object} is assignment-compatible * with the object represented by this {@code Class}. This method is * the dynamic equivalent of the Java language {@code instanceof} * operator. The method returns {@code true} if the specified * {@code Object} argument is non-null and can be cast to the * reference type represented by this {@code Class} object without * raising a {@code ClassCastException.} It returns {@code false} * otherwise. .... */ public native boolean isInstance(Object obj);
isInstance 方法,通过注释可以知道该方法主要用于判断:参数obj 是否与调用者Class(某个类对应的Class)兼容。 简单一点的就是说 参数obj 能否 Cast 为调用者对应的类。
自身类.class.isInstance(自身实例或子类实例) 返回true
String s = new String("test");
System.out.println(Object.class.isInstance(s)); //true
String 可以cast 为object。
/** * Determines if the class or interface represented by this * {@code Class} object is either the same as, or is a superclass or * superinterface of, the class or interface represented by the specified * {@code Class} parameter. It returns {@code true} if so; * otherwise it returns {@code false}. If this {@code Class} * object represents a primitive type, this method returns * {@code true} if the specified {@code Class} parameter is * exactly this {@code Class} object; otherwise it returns * {@code false}. * ... */ public native boolean isAssignableFrom(Class<?> cls);
isAssignableFrom 与isInstance 方法类似只是参数不同。
相关推荐
历史学习软件越南越南学生的历史学习软件
1. **基础语法**:每个编程语言都有其特定的语法规则,比如Python的缩进,Java的类定义,C++的头文件导入。通过这些mini程序,你可以复习和理解不同语言的基本语句、控制结构(如if-else、for、while循环)、函数...
Book name: Introduce for machine leaning 4th edition Author: Ethem Alpaydin
这个名为"spring-boot-leaning_Springbootleaning_springbootDemo_"的项目是为初学者设计的一个学习示例,旨在帮助那些对SpringBoot感兴趣的新手快速入门。 SpringBoot的核心特性包括: 1. **自动配置**:...
书籍默认解压密码 kevin.blog.csdn.net 没有积分联系博主获取。【声明】本书籍来源于网络,版权归原作者所有,仅供大家共同分享学习,请勿用于商业用途。
《Leaning OpenCV》英文原版附带得源码,很有用得东西哦!
1. **K均值聚类(K-Means)**: K-Means是最广泛应用的聚类算法之一,基于欧几里得距离进行簇中心的计算。它的工作流程包括初始化K个中心点,然后将每个数据点分配到最近的中心点所在的簇,接着更新簇中心为该簇内...
LearningOpenCV英文版+学习OpenCV中文版+书中例程 + Leaning OpenCV3 完整版 图像处理学习入门资料,英文原LearningOpenCV,中文版学习opencv,以及书中涉及到的例程。对图像处理入门很大的帮助。
Springboot42讲打包资源,包括文档和源码,需要学习的可以下载. Springboot42讲打包资源,包括文档和源码,需要学习的可以下载. Springboot42讲打包资源,包括文档和源码,需要学习的可以下载.
machine leaning 谷歌课程
在这里,hθ(x)通常表示为θ0 + θ1x1 + ... + θnxn,其中n是输入特征的数量。学习算法的目标是为参数θ选择合适的值,以便最好地预测训练集中给定的x与y之间的关系。 文档还可能介绍了如何通过最小化代价函数...
在“Leaning-PHP”这个项目中,我们可以看到作者正在通过实践来学习和提升PHP编程技能。PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,特别适合于Web开发,可嵌入到HTML中。它允许开发者动态地创建...
e-leaning
斯坦福机器学习讲义
《Leaning Spring MVC》
该文档主要介绍了OPENCV的基础知识和一些基本操作(如图像、视频读取以及图像处理等)
C-leaning:学习C语言