【LSP】基础篇:深入解析JAVA反射机制

3180386827   ·   发表于 2020-9-28   ·   编程代码

反射的概念
java的放射机制:在程序运行时,程序有能力获取一个类的所有方法和属性;并且对于任意一个对象,可以调用它的任意方法或者获取其属性
通俗解析:java文件需要编译成.class文件才能被jvm加载使用,对象的.class数据在jvm里就是Class;我们如果能拿到这个Class对象,
就能获取该Class对应的对象类型,及在该类型声明的方法和属性值;还可以根据Class创建相应的类型对象,通过Field,Method反过来操作对象
java相关类介绍
类名 描述
Class 代表类的实体,在运行的Java应用程序中表示类或者接口
Field 类的成员变量(成员变量也称为类的属性)
Method 类的方法
Constructor 类的构造方法
获取Class的三种方法
1通过已知的类型获取class
// 根据Example 获取Class =》Example.class
public Class getExample(){
Class clazz = Example.class;
return clazz;
}
2通过实例对象获取class
public Class getExampleByInstance(){
Example example = new Example();
// getClass是Object类里面的方法;《?》 是通配符
Class clazz = example.getClass();
return (Class)clazz;
}
3通过Class.forName获取全路径指定类名的class
/** forName0 本地方法,C++实现,jvm调用
* 1 className 是个类名 2 initialize 是否延迟加载 3 loader 加载器
*/
private static native Class forName0(String className, boolean initialize,
ClassLoader loader, Class caller) throws ClassNotFoundException;

public static Class forName(String className) throws ClassNotFoundException {
Class caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
// 两个forName方法最终都会调用forName0方法去加载class
public static Class forName(String name,
boolean initialize, ClassLoader loader) throws ClassNotFoundException {
....
return forName0(name, initialize, loader, caller);
}
// 示例:通过java.lang.Integer
public Class getInteger()throws ClassNotFoundException{
Class clazz = Class.forName("java.lang.Integer");
return (Class)clazz;
}
JAVA反射API
Class常用操作方法
//获取所有的构造方法 / private public
public Constructor[] getDeclaredConstructors()
//获取特定的构造方法 / private public
public Constructor getDeclaredConstructor(Class... parameterTypes)
//获取类的父类
public native Class getSuperclass()
//获取类实现的接口
private Class[] getInterfaces(boolean cloneArray)
//获取在类内定义的内部类或接口

0 Reply   |  Until 2020-9-29 | 1324 View
LoginCan Publish Content
程序耗时 0.0341秒 内存:1352KB