反射

Java的每个类被编译成.class文件的时候,java虚拟机(jvm)会自动为这个类生成一个类对象(Xxx.Class),这个对象保存了这个类的所有信息(成员变量,方法,构造器等),以后这个类要想实例化(也就是创建类的实例或创建类的对象)那么都要以这个class对象为蓝图(或模版)来创建这个类的实例。
例如 class

重要函数

java.lang.Class

public Method getMethod(String name, Class<?>... parameterTypes)

java.lang.reflect.Method

public Object invoke(Object obj, Object... args)

第二项都为可变参数

Class.forName、new Object和ClassLoader.loadClass

测试程序

class TestObject {
    static {
        System.out.println("静态初始化");
    }
    public TestObject() {
        System.out.println("构造方法");
    }
}
public class TestDriver {
    public static void main(String[] args) throws Exception {        
        //1. 使用loader.load加载
        ClassLoader loader=TestDriver.class.getClassLoader();
        loader.loadClass(TestObject.class.getName());

        //2. 使用Class.forName加载
        Class.forName(TestObject.class.getName());

        //3. 使用new Object
        TestObject object=new TestObject();
    }
}

测试结果

  1. 使用loader.load加载
    没有任何输出
  2. 使用Class.forName加载

    静态初始化

  3. 使用new Object

    静态初始化
    构造方法

java加载过程

javaLoad
ClassLoader.loadClass只是完成了类的加载, 而Class.forName与new Object的方法已经完成了类的初始化,并且new Object创建了实例对象,所以调用了构造方法。

参考 http://blog.csdn.net/cjm812752853/article/details/53956122

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值