JAVA获取Class类的4种方式
目录
一、准备
1.1 创建一个实体类如下:
二、获取Class类
2.1 调用运行时类的属性: 类名称.class
2.2 通过运行时类的对象的getClass方法
2.3 调用Class的静态方法:forName(全类名)
2.4使用类加载器:ClassLoader中的loadClass(全类名)方式获取
三、其他
一、准备
1.1 创建一个实体类如下:
public class PersonForReflect {private String name;private int age;public String addr;static{System.out.println("静态代码块儿...");}{System.out.println("动态构造块儿...");}public PersonForReflect() {}public PersonForReflect(String name, int age, String addr) {this.name = name;this.age = age;this.addr = addr;}private PersonForReflect(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}public void show(){System.out.println("hello,I am is person");}private String showNation(String nation){System.out.println("我的国籍是:"+ nation);return nation;}@Overridepublic String toString() {return "PersonForReflect{" +"name='" + name + '\'' +", age=" + age +", addr='" + addr + '\'' +'}';}
}
二、获取Class类
2.1 调用运行时类的属性: 类名称.class
private static Class getaClassMethod1() throws NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException {//1、方式一 调用运行时类的属性:.classClass clss= PersonForReflect.class;System.out.println(clss);System.out.println("方式一创建Constructor对象开始!!!!!!!!!!");Constructor constructor = clss.getConstructor(String.class, int.class, String.class);System.out.println("方式一创建Constructor对象结束!!!!!!!!!!");System.out.println("方式一创建 PersonForReflect对象开始!!!!!!!!!!");Object o = constructor.newInstance("lcg", 32, "济宁");System.out.println("方式一创建 PersonForReflect对象结束!!!!!!!!!!");PersonForReflect p = (PersonForReflect)o;System.out.println(p);System.out.println("方式一结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");return clss;}/**class com.lcg.javabase.reflect.PersonForReflect方式一创建Constructor对象开始!!!!!!!!!!方式一创建Constructor对象结束!!!!!!!!!!方式一创建 PersonForReflect对象开始!!!!!!!!!!静态代码块儿...动态构造块儿...方式一创建 PersonForReflect对象结束!!!!!!!!!!PersonForReflect{name='lcg', age=32, addr='济宁'}方式一结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
通过运行结果可以判断出:调用 PersonForReflect.class时不会自动地初始化该对象,而是按照 加载,链接,初始化三个步骤,这三个步骤是个懒加载的过程,不使用的时候就不加载。
2.2 通过运行时类的对象的getClass方法
private static Class getClassMethod2() throws NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException {//2、方式二 通过运行时类的对象的getClass方法System.out.println("方式二开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");PersonForReflect forReflect = new PersonForReflect();Class aClass = forReflect.getClass();System.out.println(aClass);System.out.println("方式二创建Constructor对象开始!!!!!!!!!!");Constructor constructor = aClass.getConstructor(String.class, int.class, String.class);System.out.println("方式二创建Constructor对象结束!!!!!!!!!!");System.out.println("方式二创建 PersonForReflect对象开始!!!!!!!!!!");Object o = constructor.newInstance("lcg", 32, "济宁");System.out.println("方式二创建 PersonForReflect对象结束!!!!!!!!!!");PersonForReflect p = (PersonForReflect)o;System.out.println(p);System.out.println("方式二结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");return aClass;}/***方式二开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!静态代码块儿...动态构造块儿...class com.lcg.javabase.reflect.PersonForReflect方式二创建Constructor对象开始!!!!!!!!!!方式二创建Constructor对象结束!!!!!!!!!!方式二创建 PersonForReflect对象开始!!!!!!!!!!动态构造块儿...方式二创建 PersonForReflect对象结束!!!!!!!!!!PersonForReflect{name='lcg', age=32, addr='济宁'}方式二结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
这种方式通过调用对象中的getClass方法获取Class的,没有特别之处
2.3 调用Class的静态方法:forName(全类名)
private static Class getaClassMethod3() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException {//3、方式三 调用Class的静态方法:forName(classPath)System.out.println("方式三开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");Class aClass = Class.forName("com.lcg.javabase.reflect.PersonForReflect");System.out.println(aClass);System.out.println("方式三创建Constructor对象开始!!!!!!!!!!");Constructor constructor = aClass.getConstructor(String.class, int.class, String.class);System.out.println("方式三创建Constructor对象结束!!!!!!!!!!");System.out.println("方式三创建 PersonForReflect对象开始!!!!!!!!!!");Object o = constructor.newInstance("lcg", 32, "济宁");System.out.println("方式三创建 PersonForReflect对象结束!!!!!!!!!!");PersonForReflect p = (PersonForReflect)o;System.out.println(p);System.out.println("方式三结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");return aClass;}/***方式三开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!静态代码块儿...class com.lcg.javabase.reflect.PersonForReflect方式三创建Constructor对象开始!!!!!!!!!!方式三创建Constructor对象结束!!!!!!!!!!方式三创建 PersonForReflect对象开始!!!!!!!!!!动态构造块儿...方式三创建 PersonForReflect对象结束!!!!!!!!!!PersonForReflect{name='lcg', age=32, addr='济宁'}方式三结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
通过Class.forName(全类名)方式获取Class,会使该类进行加载从而使得类的静态代码块执行,方式是我们平常使用比较多的方式。
2.4使用类加载器:ClassLoader中的loadClass(全类名)方式获取
private static Class<?> getaClassMethod4() throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, java.lang.reflect.InvocationTargetException {//4、方法四 使用类加载器:ClassLoaderSystem.out.println("方式四开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");ClassLoader classLoader = ReflectTest1.class.getClassLoader();Class<?> aClass3 = classLoader.loadClass("com.lcg.javabase.reflect.PersonForReflect");System.out.println(aClass3);System.out.println("方式四创建Constructor对象开始!!!!!!!!!!");Constructor constructor = aClass3.getConstructor(String.class, int.class, String.class);System.out.println("方式四创建Constructor对象结束!!!!!!!!!!");System.out.println("方式四创建 PersonForReflect对象开始!!!!!!!!!!");Object o = constructor.newInstance("lcg", 32, "济宁");System.out.println("方式四创建 PersonForReflect对象结束!!!!!!!!!!");PersonForReflect p = (PersonForReflect)o;System.out.println(p);System.out.println("方式四结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");return aClass3;}/***方式四开始!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!class com.lcg.javabase.reflect.PersonForReflect方式四创建Constructor对象开始!!!!!!!!!!方式四创建Constructor对象结束!!!!!!!!!!方式四创建 PersonForReflect对象开始!!!!!!!!!!静态代码块儿...动态构造块儿...方式四创建 PersonForReflect对象结束!!!!!!!!!!PersonForReflect{name='lcg', age=32, addr='济宁'}方式四结束!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
该方式也是懒加载方式,只用在实例化对象的时候才加载
三、其他
public static void main(String[] args) throws Exception {//获取Class 方式Class aClass = getaClassMethod1();Class classMethod2 = getClassMethod2();Class aClass1 = getaClassMethod3();Class<?> aClass2 = getaClassMethod4();System.out.println(aClass==classMethod2); //trueSystem.out.println(aClass==aClass1);//trueSystem.out.println(aClass==aClass2);//true}
通过运行发现,4中方式获取的Class对象都是相同的,也就是说明一个类的Class类的对象只有一个。
JAVA获取Class类的4种方式相关推荐
- Java获取当前时间的四种方式
面试时被问到如何获取系统当前时间,平时没有怎么注意这个问题,这里整理一下 import java.text.SimpleDateFormat; import java.util.Calendar; i ...
- java获取反射机制的三种方式
更多免费教学文章请关注这里 java 获取反射常使用的三种方式: 1.通过new对象实现反射机制 2.通过路径实现反射机制 3.通过类名实现反射机制 通过Object类的getClass方法来获取 使 ...
- Java 获取系统时间的三种方式,总结起来
业务场景中,不乏会需要取到当前系统的时间,做一些判断,比如判断某个执行过程需要花多长时间,然后将时间记录下来,返回给业务查看:或者需要或者一个唯一的值做一些表单单号,那么当前系统时间就是唯一的,可以适 ...
- java获取多线程执行结果几种方式小结
前言 在使用多线程的场景中,经常需要获取多线程的执行结果,有的甚至还需要合并不同线程的执行结果进行后续的业务逻辑处理等,下面对常用的几种获取与合并多线程的执行结果的方式做一下小结 1.thread.j ...
- java 获取随机数字的三种方法
1 //方法1 (数据类型) 2 //(最小值+Math.random()*(最大值-最小值+1)) 3 // 例: 4 (int)(1+Math.random()*(10-1+1)) //从1到10 ...
- JS基础-Java Class类以及获取Class实例的三种方式
JS基础-Java Class类以及获取Class实例的三种方式 由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名.包名.父类.实现的接口. ...
- java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)
Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...
- Java 创建类的四种方式
Java 创建类的四种方式 对于上学期已经学习过c++的同学,是不是对另一大编程语言产生了浓厚的兴趣,对于c++的面向对象编程,又和java的面向变量有何区别,下面我们从java四种创建对象来说起. ...
- java获取其他类的线程,使用Java实现面向对象编程——第七章 多线程
1.进程:是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间): Eg:用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间.当用户再次点击左面的IE浏览器, ...
最新文章
- 电脑雕刻教程_理性看待手工雕刻和电脑雕刻,手工并不代表精品,电脑雕刻也不代表战五渣...
- git 在拉取代码的时候connect 谷歌报错_工具 | 手把手教你在VSCode中使用Git
- c 递归下降识别程序_看动画轻松理解递归与动态规划
- ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能
- Form的is_valid校验规则及验证顺序
- leetcode初级算法4.只出现一次的数字
- 《SpringMVC视频教程》(p2~p3)
- windows清理系统垃圾bat脚本
- 余弦函数导数推导过程_三角函数公式篇
- 胡灵 c语言,C语言门真相
- 斯坦福大学区块链期末考试题
- Hi3861 ADC驱动 如何使用开发板上的3个按键
- 产品线 产品宽度 产品的深度 产品的相关度(理解工厂模式)
- python学习——英语单词背诵小程序
- MultiPath: Multiple Probabilistic Anchor Trajectory Hypotheses for Behavior Prediction
- linux 安装apache apu,Apache编译安装
- 路透社:特斯拉5月在华汽车订单较4月减少近一半
- 学Java对一个专科生,对一个穷人来说,是一条好的出路吗?
- 家教信息服务平台的开发
- IDEA 的Surround with快捷键 (例:try/catch)
热门文章
- C语言:L1-071 前世档案 (20 分)
- java mkfifo_命名管道FIFO和mkfifo函数
- 移远通信推出超小尺寸5G模组;前亚马逊高管加入瑞典SAAS企业咨委会;阳狮集团推出阳狮营销咨询业务板块 | 全球TMT...
- 《阿里云服务器搭建》------实现Jenkins和github之间自动化部署Java web项目
- 悟空crm在centos8的安装和环境变量配置
- DateTime.Now.ToString(yyyy/MM/dd) 输出的结果是 2006-03-16
- TCP socket 一对一编程实例中出现“烫烫烫”的问题
- 海思Hi3518EV200硬件介绍
- 股份有限公司的优缺点
- SharePoint使用说明(3)--文档库