`

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

    博客分类:
  • java
阅读更多
1:Class cl=A.class; 
    JVM将使用类A的类装载器, 将类A装入内存(前提是:类A还没有装入内存),不对类A做类的初始化工作.返回类A的Class的对象。

2:Class cl=对象引用o.getClass();
    返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象 。

3:Class.forName("类名");
     .装入类A,并做类的初始化

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

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

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


例子:

待反射代码:
package reflect;

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 reflect;

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);
        }
    }
}
分享到:
评论

相关推荐

    浅谈java中类名.class, class.forName(), getClass()的区别

    Java 中类名.class, class.forName(), getClass() 的区别 Java 中有三种方式可以获取 Class 对象,即类名.class、class.forName() 和 getClass()。这些方法都可以获取 Class 对象,但是在获取 Class 对象的过程中,...

    class literal & instance.getClass() & Class.forName(String className)

    在Java编程语言中,"class literal"、"instance.getClass()" 和 "Class.forName(String className)" 是三个与类加载和类型查询紧密相关的概念。了解这些概念对于深入理解Java运行时的类加载机制至关重要。 首先,让...

    Java中通过Class类获取Class对象的方法详解

    通过Class类可以获取Class对象,获取Class对象有三种方式:通过Object类的getClass()方法、通过类名.class获取Class对象、通过Class类中的forName()方法。每种方式都有其特点和应用场景,掌握这些方式可以帮助开发者...

    一些有关反射的方法

    Class Class.forName(String packageNameAndClassName); Class类的静态成员方法,通过完整的包名.类名获取对应.class文件的Class对象 同时也可以作为.class文件加载的方法。 Class 类名.class; 通过类名.class...

    java.lang.Class类

    1. 使用forName和newInstance结合起来,可以根据存储在字符串中的类名创建对象。 2. 使用Class类可以实现类的反射机制,动态地加载和使用类。 3. 使用Class类可以实现对象的克隆和序列化。 Java.lang.Class类是Java...

    Java中Class对象详解.docx

    1. **Class.forName(类名字符串)**: 这种方式通过传入类的全名(包括包名)作为参数,动态地加载并返回对应的Class对象。如果类尚未被加载到JVM,那么它会先进行加载。 2. **类名.class**: 这是一种更直接的方式,...

    JAVA反射机制-Class类-Class对象的获取.pdf

    当我们不知道具体的类名,只能通过字符串形式传递时,可以使用`Class.forName`方法。 ```java try { Class<?> clazz = Class.forName("org.whatisjava.reflect.Foo"); Object obj = clazz.newInstance(); ...

    java元数据——CLass类

    1. 通过 Class 的 forName(String name) 方法传入一个类的完整类路径,也可以获得Class 对象,但由于使用的是字符串,必须强制转换才可以获取泛型的Class的Class对象,并且你应该考虑到这个方法可能抛出的 ...

    Java反射学习笔记

    目录1. 获取类类型2. 获取类内部信息2.1 构造函数2.1.1 获取构造函数2.1.2 使用构造函数构造实例2.2 Field 对象2.2.1 获取 Field 对象2.2.2 Field 的 set...通过全类名获取:Class.forName(“全类名”),这是Class 类的

    java中的Class类和反射.docx

    - 使用`Class.forName("类的全限定名")`,例如`Class.forName("java.lang.String")`。 #### 二、Class类的特性 `Class`类自身并没有公共的构造方法,它是由JVM自动创建的。这意味着我们无法直接实例化`Class`对象...

    JAVA反射之类对象

    类对象与类的对象的区别:  类的对象:基于某个类new出来的对象,也称为实例对象  类对象:类加载的产物,...Class c = Class.forName(“包名.类名”);//工厂:创建类对象工厂public static Object createObject(S

    温习java反射,让你对反射有全新的认识(csdn)————程序.pdf

    Class<?> clazz = Class.forName("java.util.Date"); ``` 这需要提供类的全限定名,并且如果类不存在,会抛出`ClassNotFoundException`。 在实际应用中,`getClass()`常用于简单Java类与参数自动赋值的场景,如...

    Java EE:Reflect 反射技术.docx

    - 通过类的全名获取:`Class.forName(完整类名)` - 通过类加载器获取:`this.getClass().getClassLoader().loadClass(类名)` - 其他:如通过子类的`getSuperclass()`获取父类的Class对象,或者通过基本类型获取其...

    java反射深入剖析(推荐)

    1. 使用`Class.forName("类全名")`,此方法需要提供类的完全限定名(包括包名),并可能抛出`ClassNotFoundException`。 2. 调用对象的`getClass()`方法,如`new Demo().getClass()`,这会返回该对象所属类的`Class`...

    【Java基础笔记】反射.docx

    - `java.lang.Class`:表示运行时的类信息,通过类名获取`Class`对象的方法有`forName()`、`getClass()`、`类名.class`等。 - `java.lang.reflect.Method`:表示类的方法信息,提供了获取方法和调用方法的功能。 ...

    java反射机制.rar

    - 使用Class.forName()方法,传入类全名(包括包名)。 - 对象.getClass()方法,用于获取对象的Class对象。 - 类名.class,静态调用,直接获取对应的Class对象。 二、反射的主要功能 1. 创建对象:通过Class对象...

    652.650.JAVA基础教程_反射-获取运行时类的方法的内部结构(652).rar

    - `Class.forName(String className)`:通过类名获取Class对象。 - `类名.class`:在类实例或类名后面加上`.class`也可以得到该类的Class对象。 - `某个对象.getClass()`:通过对象实例获取其Class对象。 4. **...

    java反射应用的原理以及应用

    1. 使用`Class.forName(String className)`方法,传入类的全名(包括包名)来获取`Class`对象。如果类未找到,会抛出`ClassNotFoundException`。 2. 使用`类名.class`,如`X.class`,这是静态的方式,可以直接获取到...

    Java 基础(7-8) - 反射机制详解.pdf

    每个 Java 类运⾏时都在 JVM ⾥表现为⼀个 Class 对象,可以通过类名.class、类型.getClass()、Class.forName("类名") 等方法获取 Class 对象。 二、Class 类 Class 类是 Java 反射机制的核心。它提供了多种方法来...

Global site tag (gtag.js) - Google Analytics