JDK源码(十三):Class

Posted jdkSpring

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK源码(十三):Class相关的知识,希望对你有一定的参考价值。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

在日常开发过程中,会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。比如JDBC链接:

Class.forName("com.mysql.cj.jdbc.Driver");
反射机制的相关类

Class代表类的实例,表示正在运行的Java应用程序中的类和接口。Class没有公共构造函数。相反,Class对象由Java虚拟机在加载类时自动构造,并通过调用类加载器中的defineClass方法来构造。

类名
public final class Class<T>  implements java.io.Serializable, GenericDeclaration, Type, AnnotatedElement
变量(部分)
//类加载器,在JVM中初始化private final ClassLoader classLoader;//反射的工厂类,但是此类并不实例化对象//只是深度拷贝类的构造器,方法,属性private static ReflectionFactory reflectionFactory;
在Class中有个静态代码块, native方法表示向JVM 注册本地方法。
private static native void registerNatives();static { registerNatives();}

JDK源码(十三):Class

方法(部分)
forName(String className)

JDK源码(十三):Class

返回给定字符串名称的类或接口关联的类对象,@CallerSensitive为了防止 通过构造双重反射来提升权限
T newInstance()

JDK源码(十三):Class

创建由这个Class对象表示的类的新实例,类被实例化,就像是由一个带有空参数列表的new表达式实例化一样。
public class Student implements Serializable {
    private static final long serialVersionUID = -1L; private String id;
private String name;
public Integer age;
public Student(){}
public Student(String id, String name) { this.id = id; this.name = name; }
private int sum(int i, int j){ return i + j; }
public Student getStudent(int id){ return this; }
public Student getStudent(String name){ return new Student(); }
public String getInfo(){ return id + " " + name; }}
Student student = Student.class.newInstance();
但是在jdk9以上,这个方法被弃用了,而使用下面的方法:
Student student =  Student.class.getDeclaredConstructor().newInstance()
getMethods()

JDK源码(十三):Class

返回一个数组,该数组包含Method对象,这些对象包含该class对象表示的类或接口的所有公共方法,包括由该类或接口声明的方法以及从父类和父接口继承的方法。里面调用了privateGetPublicMethods方法

JDK源码(十三):Class

与getMethods()方法对应的还有一个getDeclaredMethods(),这个方法返回一个Method对象数组,其中包含该Class对象表示的类或接口的所有已声明方法,包括public、protected、default(package)访问和private方法,但不包括继承的方法。

JDK源码(十三):Class

JDK源码(十三):Class

实例

JDK源码(十三):Class

getFields() 

JDK源码(十三):Class

返回一个包含Field对象的数组,该数组包含Class对象表示的类或接口的所有可访问公共字段。包括父类和父接口的公共字段。调用的privateGetPublicFields方法如下:

JDK源码(十三):Class

getFields()也有一个对应的方法getDeclaredFields(),这个方法返回Field对象的数组,该数组包含该Class对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。
getDeclaredFields()

JDK源码(十三):Class

JDK源码(十三):Class

实例
getResourceAsStream(String name)

此方法查找具有给定名称的资源。搜索与给定类关联的资源的规则是通过定义类的ClassLoader来实现的。此方法委托给此对象的类加载器。如果此对象是由引导类加载器加载的,则方法将委托给getSystemResourceAsStream。如果name以'/'开头,则资源的绝对名称是'/'后面的部分。如果名称不是绝对的,则添加包名称前缀,如果名称是绝对的,则删除前导“/”。
实例
InputStream resourceAsStream =  Student.class.getResourceAsStream("application.xml");

以上是关于JDK源码(十三):Class的主要内容,如果未能解决你的问题,请参考以下文章

JDK源码(二十三):HashMap

java之java代码的执行机制

jdk源码分析——String类

JDK动态代理源码剖析

JDK源码阅读之 HashMap

阅读JDK源码后,我有了优化它的冲动!