类名.class, class.forName(), getClass()区别

1:Class cl=A.class; java

JVM将使用类A的类装载器, 将类A装入内存(前提是:类A尚未装入内存),不对类A作类的初始化工做.返回类A的Class的对象。 this

2:Class cl=对象引用o.getClass(); code

返回引用o运行时真正所指的对象(由于:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 。 对象

3:Class.forName("类名"); 内存

.装入类A,并作类的初始化 get

.getClass()是动态的,其他是静态的。 io

.class和class.forName()只能返回类内field的默认值,getClass能够返回当前对象中field的最新值 class

Class.forName() 返回的是一个类,.newInstance() 后才建立一个对象,Class.forName()的做用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的 import

待反射类: 变量

package yerasel;

public class Person {
    private String name = "Alfira";
    public void getName() {
        System.out.println(name);
    }
    public void setName(String name, int a) {
        this.name = name + a;
    }
}



反射代码:

package yerasel;

import java.lang.reflect.Method;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        show("yerasel.Person");
    }

    private static void show(String name) {
        try {
            // JVM将使用类A的类装载器,将类A装入内存(前提是:类A尚未装入内存),不对类A作类的初始化工做
            Class classtype3 = Person.class;
            // 得到classtype中的方法
            Method getMethod3 = classtype3.getMethod("getName", new Class[] {});
            Class[] parameterTypes3 = { String.class, int.class };
            Method setMethod3 = classtype3
                    .getMethod("setName", parameterTypes3);

            // 实例化对象,由于这一句才会输出“静态初始化”以及“初始化”
            Object obj3 = classtype3.newInstance();
            // 经过实例化后的对象调用方法
            getMethod3.invoke(obj3); // 获取默认值
            setMethod3.invoke(obj3, "Setting new ", 3); // 设置
            getMethod3.invoke(obj3); // 获取最新
            System.out.println("----------------");

            // 返回运行时真正所指的对象
            Person p = new Person();
            Class classtype = p.getClass();// Class.forName(name);
            // 得到classtype中的方法
            Method getMethod = classtype.getMethod("getName", new Class[] {});
            Class[] parameterTypes = { String.class, int.class };
            Method setMethod = classtype.getMethod("setName", parameterTypes);
            getMethod.invoke(p);// 获取默认值
            setMethod.invoke(p, "Setting new ", 1); // 设置
            getMethod.invoke(p);// 获取最新
            System.out.println("----------------");

            // 装入类,并作类的初始化
            Class classtype2 = Class.forName(name);
            // 得到classtype中的方法
            Method getMethod2 = classtype2.getMethod("getName", new Class[] {});
            Class[] parameterTypes2 = { String.class, int.class };
            Method setMethod2 = classtype2
                    .getMethod("setName", parameterTypes2);
            // 实例化对象
            Object obj2 = classtype2.newInstance();
            // 经过实例化后的对象调用方法
            getMethod2.invoke(obj2); // 获取默认值
            setMethod2.invoke(obj2, "Setting new ", 2); // 设置
            getMethod2.invoke(obj2); // 获取最新

            System.out.println("----------------");

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
相关文章
相关标签/搜索