JAVA反射机制

xiaoxiao2021-02-28  112

反射核心类

Class

ClassLoader

程序的运行过程

图解: 1.ClassLoader将其Load到内存汇总的CodeSegment 2.运行环境找到main才开始执行 3.动态加载机制,运行过程中会有更多class被load到内存

ClassLoader的类的加载机制

1.非一次性加载 2.运行期间动态加载 3.static语句块(静态代码块)在加载后执行一次 4.dynamic语句(动态代码块)块在每次new新的对象之后会执行(构造方法之后运行,等同于构造方法内的语句)

-verbose:class 控制台显示详细加载过程

TestDynamicLoading.java

public class TestDynamicLoading { public static void main(String[] args) { new A(); System.out.println("**----------**"); new B(); new C(); new C(); new D(); new D(); } } class A { } class B { } class C { static { System.out.println("CCCCCCCCCC"); } } class D { { System.out.println("DDDDDDDDDD"); } }

运行控制台输出(E:/WorkSpace为工作空间)

... [Loaded A from file:/E:/WrokSpace/TestReflect/bin/] **----------** [Loaded B from file:/E:/WrokSpace/TestReflect/bin/] [Loaded C from file:/E:/WrokSpace/TestReflect/bin/] CCCCCCCCCC [Loaded D from file:/E:/WrokSpace/TestReflect/bin/] DDDDDDDDDD DDDDDDDDDD ...

JDK内置的ClassLoader

bootstrap classloader 核心加载类,本地语言编程,不可以读取extesion classloader 扩展加载类,jdk扩展类,jdk/jre/lib/ext目录下的类,可被读取applicatioon classloader 用户自定义类加载类,other classloader SecureClassLoader URLClassLoader

TestJDKClassLoader.java

JDKClassLoader的层次关系(不是继承)

所有的classloader都是从java.lang.classloader继承而来的 getParent()方法是获取当前加载类的上一级加载对象,而不是父类 问parentloader加载后就不再加载,即parentloader加载以后sonloader不再加载,保证程序运行加载安全机制,如application classloader不可以加载bootstrap classloader中声明的类。

反射

Class c = Class.forName(str); Object o = c.newInstance(); Method[] methods = c.getMethods(); for (Method mmethod) { if (m.getName().equals("m")) { m.invoke(o); m.getParameterTypes(); } }

关于invoke()方法,是可变参数方法,第一个参数传入方法体所在对象,第二+个参数出入方法对应传入的参数。 实现接口的方法可以确定参数个数及类型,接口new对象的方法的可扩展性。 关于getParameterTypes()方法,返回传参类型。 关于getReturnType()方法,返回方法的返回类型。

通过反射的API接口,去探索运行期间的一个Class的内部结构,并且根据内部结构来决定方法怎么进行调用。

转载请注明原文地址: https://www.6miu.com/read-78722.html

最新回复(0)