NO.5 获得一个类的类对象的四种方式

方式一:调用运行时类的属性:.class

Class c = Person.class;
System.out.println(c);

这种方式适用于编译期间已知的类型,如果某个类型编译期间是已知的,优选考虑此方法

优点:代码更安全、效率更高、简洁

缺点:要求编译期间这个类型就要存在

注意:基本数据类型和 void 有只能通过该方式获取 Class对象;不能通过方式三和方式四来获得

方式二:通过运行时类的对象,调用getClass()

Person p1 = new Person();
Class c2 = p1.getClass();
System.out.println(c2);

这个方法在 java.lang.Object 类型中声明的,可以获取该对象的运行时类型的 Class 对象; 

适用情况:必须先有对象,才能获取 Class 对象

注意:同一字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的 Class 对象都是同一个。

方式三:调用Class的静态方法:forName(String classPath)

Class c3 = Class.forName("com.java.Person");
c3 = Class.forName("java.lang.String");
System.out.println(c3);

该方法需要传入一个字符串参数,该值是某个类的全限定名(即完整的包.类型名),该方法适用于除了数组以外的任意引用数据类型;

已知一个类的全类名,且该类在类路径下, 可通过Class类的静态方 法forName()获取,可能抛出ClassNotFoundException。

多用于配置文件,将类名定义在配置文件中,读取文件,加载类。

优点:这个类型可以在编译期间未知,这个类名称可以在代码中出现,也可以配置在配置文件中,或键盘输入等方式来指定

方式四:使用类的加载器:ClassLoader (了解)

ClassLoader classLoader = ReflectionTest.class.getClassLoader();
Class c4 = classLoader.loadClass("com.java.Person");
System.out.println(c4);

该方法也需要传入一个类的全限定类名,该方法一般都是用在自定义类加载器对象去加载指定路径下的类。

注意:无论是哪种方式获取,Class 对象都是唯一的!!! 

@Test
public void test() throws ClassNotFoundException{
    Class<?> c1 = String.class;
    Class<?> c2 = "hello".getClass();
    Class<?> c3 = Class.forName("java.lang.String");
    Class<?> c4 = ClassLoader.getSystemClassLoader().loadClass("java.lang.String");
    System.out.println(c1 == c2);     // true
    System.out.println(c1 == c3);     // true
    System.out.println(c1 == c4);     // true
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值