java学习笔记之反射—Class类实例化和对象的反射实例化
反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类的实例化对象,
可以采用三种方式完成。
java.lang.Class类的定义:
public final class Class<T>
extends Object
implements Serializable, GenericDeclaration, Type, AnnotatedElement, TypeDescriptor.OfField<Class<?>>, Constable
1.Object类支持:
Object类可以根据实例化对象获取Class对象:public final Class<?> getClass()
这种方式有一个缺点:如果现在只是想获得Class类对象,则必须产生指定类对象后才可以获得,会造成一个无用的对象产生
代码:
Person per = new Person();//已经存在有指定类的实例化对象
Class<? extends Person> cls = per.getClass();
2.JVM直接支持:
采用“类.class”的形式实例化
代码:
Class<? extends Person> cls2 = Person.class;
3.Class类支持:
在Class类里面提供有一个static方法:
- 加载类:public static Class<?> forName(String className) throws ClassNotFoundException
这种模式最大的特点是可以直接采用字符串的形式定义要使用的类型,并且程序不需要编写任何的import程序
注意:使用该方法时参数必须是完整类名,如以下代码中IOtest为包名,InputUtil是类名
Class<?> cls3 = Class.forName("IOtest.InputUtil");
完整代码:
package Reflect;
public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub
// 1、Object类支持
Person per = new Person();//已经存在有指定类的实例化对象
Class<? extends Person> cls = per.getClass();
System.out.println(per);
System.out.println(cls.getName());//获取的是类的完整名称
// 2、JVM直接支持
Class<? extends Person> cls2 = Person.class;
System.out.println(cls2.getName());
// 3、Class类支持
Class<?> cls3 = Class.forName("IOtest.InputUtil");//不需要用import导入IOtest包
System.out.println(cls3.getName());
}
}
class Person{}
获取Class对象之后最大的意义实际上并不是在于这是一个对象,更重要的是Class类里面提供有一个对象的
反射实例化方法(代替了关键字new):
在jdk1.9以前的实例化:public T newInstance() throws InstantiationException,IllegalAccessException
jdk1.9之后:clazz.getDeclaredConstructor().newInstance()
通过反射实现的对象实例化处理,依然要调用类中的无参构造方法,其本质等价于“类 对象 = new 类()”,也就是说相当于隐藏了关键
字new,而直接使用字符串进行了替代
代码实例:
/*
* 通过newInstance()方法实例化Student类对象
*/
package Reflect; public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Class<?> cls = Class.forName("mldn.Student");
Object obj = cls.newInstance();//实例化对象,jdk1.9后被废除
System.out.println(obj);
//jdk1.9之后:被clazz.getDeclaredConstructor().newInstance()替代
Object o = cls.getDeclaredConstructor().newInstance();
System.out.println(o);
}
}
java学习笔记之反射—Class类实例化和对象的反射实例化的更多相关文章
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- java学习笔记之日期日历类
java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...
- Java学习笔记(二)——类和对象
[1]类是模子,确定对象将会拥有的特征(属性)和行为(方法). [2]类的特点:类是对象的类型: 具有相同属性和方法的一组对象的集合. [3]属性:对象具有的各种特征(每个对象的每个属性都拥有特定值) ...
- java学习笔记17(Calendarl类)
Calendar类:(日历) 用法:Calendar是一个抽象类:不能实例化(不能new),使用时通过子类完成实现,不过这个类不需要创建子类对象,而是通过静态方法直接获取: 获取对象方法:getIns ...
- Java学习笔记【四、类、对象、接口】
编程语言的发展 机器语言 过程语言 面向对象编程--封装.继承.多态 关键字 extends implements override overload super this static abstra ...
- Java学习笔记七——数组工具类Arrays
数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> ...
- java学习笔记IO之File类
File类总结 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Times } p.p2 { margin: 0.0px 0.0px 0.0p ...
- Java学习笔记26(Math类、Arrays类、BigInteger类、BigDecimal类)
Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即 ...
- Java学习笔记25(System类)
System类,系统类,包含的是静态方法,无法创建对象 这里介绍几个简单的方法,其他一些在后边用到的时候会讲 类方法: currentTimeMillis():获取当前毫秒数 package demo ...
- Java学习笔记24(Integer类)
这里介绍基本数据类型包装类,Integer是int的包装类, 其他的基本数据类型的包装类的方法和Integer的方法几乎一致,会一种即可全会 基本数据类型包装类的特点:用于在基本数据类型和字符串之间进 ...
随机推荐
- kakfa+zookeeper集群搭建
1:下载对应安装包 zookeeper-3.4.14.tar.gz:链接:https://pan.baidu.com/s/19_eYsv5r9bg0AKv3TzjpZQ 提取码:ik8a kaf ...
- phpmyadmin配置文件详解
PHPMyadmin配置文件config.inc.php或config.default.php内容及作用解析大致如下: /** * phpMyAdmin Configuration File * * ...
- 基于 H5 Canvas 实现楼宇新风系统
前言 现如今,新型冠状病毒疫情牵动着每一个人的神经,每天起床后的第一件事就是打开疫情地图,看看最新的疫情数据. (http://www.hightopo.com/demo/coronavirus/) ...
- WARNING: The host '$hostname' could not be looked up with resolveip. (转)
环境介绍:CentOS6.X MySQL版本:5.5.X以上 执行scripts/mysql_install_db脚本时,抛出一条Warning,主机名和IP地址无法解析: The host '$ho ...
- 不懂怎么创建可视化大屏?手把手教你使用数据可视化BI软件创建工厂车间数据监控大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以工厂车间数据监控大屏为例 ...
- 安卓接入融云IM连接不上??
融云初始化失败?融云连接失败??连接回调方法不执行???不可能的,就那么几行代码,怎么会有错. 1.项目gradle里添加融云maven仓库 maven {url "https://dl.b ...
- bitmap+文本生成新的bitmap的实现
注:参数content为生成二维码bitmap的内容,该二维码bitmap在和文本title组合生成一个新的bitmap package info.ecloud.merchant.util; impo ...
- Android中使用AlarmManager设置闹钟
场景 设置闹钟 闹钟提醒 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建 ...
- Redis-位图
关于位图,可能大家不太熟悉, 那么位图能干啥呢?位图的内容其实就是普通的字符串,也就是byte数组,我们都知道 byte 8 位无符号整数 0 到 255 说个场景.比如你处理一些业务时候,往往会存在 ...
- lua学习之深入函数第一篇
深入函数第一篇 函数是第一类值,具有特定的词法域 第一类值 第一类值的意思是函数与 lua 中的其他类型如数字,字符串具有相同的权力 函数可以存储到全局变量或局部变量变量,还可以存储到 table 中 ...