JAVA反射机制

反射核心类

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的内部结构,并且根据内部结构来决定方法怎么进行调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值