请问老师一个反射的问题

通过执行Class.forName("com.bjsxt.dao.A")就能执行类A中的static {}块,而通过Class clazz =

A.class则不行为什么啊,后者做了什么啊,谢谢

我来说说我的观点,

使用Class.forName()是可以的,这个毫无疑问,楼上的不行,因为你把main方法跟static块都放一起了,想像一下,你执行main方法的时候,Test1已经被类加载器加载进内存,这个时候你再去main中forName的话,由于Test1已经被加载进内存static块已经被执行。什么是static? 静态的,只会被执行一次,所以你在forName肯定不会在执行了。 楼上的 你在去写一个Test2出来,将main放入Test2,再去forName Test1类,这样就可以看到是可以触发static的。

再来说说为什么直接赋值不行,由于forName是采用类加载器加载,所以调用此方法,是将类加载入内存,所以会执行static。如果直接赋值,这个类是没有加载入内存的,但是你可以接着操作就会被加载进内存,也就是说会触发static,怎么操作见代码:

[code="java"]Class cls= com.bjsxt.dao.A.class
A a = (A) cls.newInstance();[/code]

这样既可。

问题是不是问错了。
[quote]通过执行Class.forName("com.bjsxt.dao.A")就能执行类A中的static {}块[/quote]
这个应该不能执行static块吧,
[quote]通过Class clazz =A.class则不行为什么啊[/quote]
这个应该也不会触发static块吧

我试了下,Class.forName的能触发static块,但是Class xx = A.class的就不行

[quote]我试了下,Class.forName的能触发static块,但是Class xx = A.class的就不行[/quote]

不好意思,我也试了下,都不能触发static块,完整代码如下:
[code="java"]package com.test0920;

public class Test1 {
static {
System.out.println("--static--");
}

public static void main(String[] args) throws ClassNotFoundException {
    System.out.println("--1--");
    Class class2 = Class.forName("com.test0920.Test1");
    System.out.println("--2--");
    Class class3 = Test1.class;
    System.out.println("--3--");
}

}[/code]

输出:
[code="java"]---
--1--
--2--
--3--[/code]

以上说明,两个方法都没有触发,而是调用主函数时触发了。

[quote]使用Class.forName()是可以的,这个毫无疑问,楼上的不行,因为你把main方法跟static块都放一起了,想像一下,你执行main方法的时候,Test1已经被类加载器加载进内存,这个时候你再去main中forName的话,由于Test1已经被加载进内存static块已经被执行。什么是static? 静态的,只会被执行一次,所以你在forName肯定不会在执行了。 楼上的你在去写一个Test2出来,将main放入Test2,再去forName Test1类,这样就可以看到是可以触发static的。 [/quote]
不好意思,我错了!

我还正在奇怪呢。。。