Java反射中Object.getClass() ; Class.forName(); User.class区别!

这三个方法都是用来获取Class对象的!!!

一、Object.getClass()

        这是Java中所有类的基类Object的一个方法。当你有一个对象时,你可以调用这个方法来获取该对象的运行时类。例如:

String str = "Hello";
Class<? extends String> c = str.getClass();

在这个例子中,str.getClass()将返回一个代表String类的Class对象。

二、Class.forName()

        这个方法主要用于动态加载类。你可以通过传递一个字符串参数(包含完全限定的类名)来获取对应的Class对象。

Class<?> c = Class.forName("java.lang.String");

        Class.forName("java.lang.String")将返回一个代表String类的Class对象。需要注意的是,这个方法需要完全限定类名(包括包名)。

三、User.class

        在Java中,所有的字面类名都可以作为Class对象来使用。所以String.class就是一个代表String类的Class对象。例如:

Class<User> c = User.class;

        String.class被用来直接获取一个代表String类的Class<String>对象。这个语法在类型注解或者泛型代码中非常有用。

代码示例

package ReflectionTest;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.io.Serializable;
import java.lang.reflect.Constructor;

/**
 *  什么叫反射
 **/

public class Reflection {

    public static void main(String[] args) throws ClassNotFoundException {

        //一、通过反射获取类的CLass对象
        Class<?> c1 = Class.forName("ReflectionTest.User");
        System.out.println(c1);

        //获取c1构造器
        try {

            Constructor< ? > constructor = c1.getConstructor(String.class, int.class);
            System.out.println("获取c1全部参数构造器:" + constructor);

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        // 一个类在内存中只有一个class对象
        // 一个类敲加载后 的整个结构都会被封装在CLass 对象中
        Class<?> c2 = Class.forName("ReflectionTest.User");
        Class<?> c3 = Class.forName("ReflectionTest.User");
        Class<?> c4 = Class.forName("ReflectionTest.User");

        System.out.println("c2:" + c2.hashCode());
        System.out.println("c3:" + c3.hashCode());
        System.out.println("c4:" + c4.hashCode());


        //二、Object.getClass();
        // .getClass()方法获取的Class和反射获取类的CLass对象
        User user = new User("lucy", 11);
        Class<? extends User> c5 = user.getClass();
        System.out.println(c5);
        System.out.println("c5:" + c5.hashCode());

        //三、User.class
        Class<User> c6 = User.class;
        System.out.println("c6:" + c6.hashCode());
    }
}

@Data
@AllArgsConstructor
class User implements Serializable {

    /** 名称 */
    private String name;

    /** 年龄 */
    private int age;


}

        总结一下,如果你已经有一个对象并且想要获取其运行时类,你应该使用Object.getClass()。如果你想要动态加载一个类,你应该使用Class.forName()。如果你想要获取一个类的Class对象并且你知道这个类,你可以直接使用类名后面加.class。

posted @ 2023-11-15 01:20  南方的猫  阅读(43)  评论(0编辑  收藏  举报  来源