博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 反射机制(二)
阅读量:6922 次
发布时间:2019-06-27

本文共 1806 字,大约阅读时间需要 6 分钟。

  《Core Java Volume I --- Fundamentals》介绍了三种创建Class对象的方法。本文将举例说明这三种创建Class对象---创建类的方法。

一、public final native Class<?>  getClass()

  Object类中的getClass()方法将返回一个Class类型的实例,即一个具体的类(为Class的对象)。

1)Class未参数化,即API为Class getClass()

       

 

 

 

 

 

输出结果class reflection.Employee

返回值分析:class + 类完全限定名

2)Class参数化,约束传入参数继承类型

3)Class参数化,指定具体约束参数

代码分析getClass()默认返回值为Class<?>,即参数类型未定。因此必须要强制类型转换成Class<Employee>

如果需要去掉返回结果中的关键字class,那么使用Class类的API---String getName()

1 public String getName() {2     if (name == null)3         name = getName0();4     return name;5 }6 7 // cache the name to reduce the number of calls into the VM8 private transient String name;9 private native String getName0();

输出结果reflection.Employee

二、public static Class<?> forName(String className) 

  通过调用java.lang.Class的静态方法forName获得类名对应的Class对象。

1 public static Class
forName(String className) 2 throws ClassNotFoundException {3 return forName0(className, true,ClassLoader.getCallerClassLoader());4 }

  其中传入的参数String className必须是完全限定名,即包名加类名。

  说明forName方法只有在className是与getName返回格式相同的类名或者接口名时才能够执行成功,否则forName方法抛出ClassNotFoundException异常。另外一点,forName方法是用于手工加载类。

输出结果:class reflection.Employee

    

  小结一下:getName返回的字符串格式是,包名+类名,不包括项目名。因此forName字符串格式也为,包名+类名。这与JDBC中利用forName静态方法加载驱动类略有区别

三、class<T> T.class,其中T代表数据类型

输出结果

class reflection.Employee

int
class java.lang.Integer
interface java.lang.Runnable

分析代码:曾经不求甚解的我一直以为此处class是一个属性,不过在写这篇博客时,我明白了之前的观点是错误的。首先,从Eclipse代码的高亮来看,class就是关键字;其次int是基本数据类型,不可能具有属性。综上几点原因,可以总结如下:如果T是任意的Java类型,T.class将代表与其匹配的类型

四、总结反思

  Class对象实际上表示的是数据类型(基本或引用数据类型),而这个类型并非一定是类

      

  当然,从这里可以看出Class<int>允许参数是基本数据类型,与泛型要求必须是引用数据类型是不同的。可以当作一个特例来记忆。

 

参考文献

Core Java Volume I --- Fundamentals   Cay S. Horstmann  Gary Cornell 著    

 

  声明:文章系作者原创整理,如需转载请联系本人。

 

转载于:https://www.cnblogs.com/forget406/p/5493970.html

你可能感兴趣的文章
python基础-02-while格式化逻辑运算
查看>>
MySQL简介
查看>>
js如何判断客户端是iOS还是Android等移动终端
查看>>
《微分方程_附应用及历史注记》Page 4.
查看>>
Analysis by Its History_exercise 2.1
查看>>
Python中的正则表达式
查看>>
SQLServer2005的维护计划无法删除的解决方法
查看>>
网络编程5_进程
查看>>
20172304 2017-2018《程序设计与数据结构》实验1报告
查看>>
windows双机调试
查看>>
J实现时间格式的转换(附加对象的转换)
查看>>
Marshal Code Into Another Thread(STAThread)
查看>>
V-MODEL指令实现方法
查看>>
webpack打包的原理的优势?
查看>>
java对于Redis中jedis的操作
查看>>
移动 H5 首屏秒开优化方案探讨
查看>>
redis的数据持久化方案
查看>>
2015年度精品 最新力作32位和64位xp,win7,win8,win10系统下载(电脑城专用版)
查看>>
hdu Wooden Sticks
查看>>
图像分类学习笔记
查看>>