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。