`

Java反射机制解析(一)

    博客分类:
  • java
 
阅读更多

Class对象的生成方式:

1.Class.forName("包名+类名") 

2.类名.class

3.实例对象.getClass()

实体类:

package gll;

/**
 * Created by Administrator on 2015/4/1.
 */
public class User {

    private String name;

    private String age;

    static {
        System.out.println("init class by static...");
    }

    {
        System.out.println("init class by no static...");
    }

    public User() {
        System.out.println("constructor....");
    }

    public User(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 测试用例:

 

package gll;

import org.junit.Before;
import org.junit.Test;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;

/**
 * Created by Administrator on 2015/4/1.
 */
public class UserReflectTest {

    private Class<?> classByForName;

    @Before
    public void setUp() throws Exception {

        String classPath = "gll.User";
        classByForName = Class.forName(classPath);
    }


    @Test
    public void should_init_class_for_class() throws Exception {

        Class<?> userClass = User.class;

        assertThat(classByForName == userClass, is(true));
    }

    @Test
    public void should_init_class_for_getClass() throws Exception {

        Class<?> userClass = new User().getClass();

        assertThat(classByForName == userClass, is(true));
    }
}

 总结:

          加载类的时候初始化静态的方法属性。

          new类实例对象的时候初始化非静态方法属性。

          因此,三种方式生成Class对象,其实只有一个Class对象。在生成Class对象的时候,首先判断内存中是否已经加载。所以,生成Class对象的过程如下:

        当我们编写一个新的java类时,JVM就会编译成class对象,存放在同名的.class文件中。在运行时,当需要生成这个类的对象,JVM就会检查此类是否已经装载内存中。若是没有装载,则把.class文件装入到内存中。若是装载,则根据class文件生成实例对象。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics