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的方法几乎一致,会一种即可全会 基本数据类型包装类的特点:用于在基本数据类型和字符串之间进 ...
随机推荐
- 1282 - Leading and Trailing 求n^k的前三位和后三位。
1282 - Leading and Trailing You are given two integers: n and k, your task is to find the most signi ...
- vue垂死挣扎系列(一)——vue-cli快速搭建
项目安装(windows10安装环境+vue-cli 2.x) 安装node 在官网上下载稳定版本的node node.js官网 一路傻瓜安装 测试是否安装成功 cmd中node --version ...
- 学习css常用基本层级伪类属性选择器
常见的css选择器包含:常用选择器.基本选择器.层级选择器.伪类选择器.属性选择器,其中常用选择器分为:1.html选择符*{}//给页面上所有的标签设置模式:2.类选择符.hcls{}//给clas ...
- 14.Android-使用sendMessage线程之间通信
1.Handler介绍 Handler 是一个消息分发对象.handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,通过它可以实现在不同线程之间传递消息 本章Handle ...
- author模块
一.auth模块简介 1.什么是auth模块,auth模块主要是解决什么问题 还是那句话,‘没有无缘无故的爱,也没有无缘无故的恨 凡是必有因’, 像我们开发一个网站,不可避免的设计网络用户系统,比 ...
- datagridview 如何显示记载中
要实现如下效果,有何思路?
- java动态拼接sql语句并且执行时给sql语句的参数赋值
问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 ...
- React HOC(高阶组件)
一.定义 高阶函数:函数接受函数作为输入,或者输出一个函数. 高阶组件:接受React组件作为输入,或是输出一个组件.即hocFactory:: W: React.Component => E: ...
- 软考复习之UML设计篇
UML统一建模语言 构件图:描述系统的物理结构,它可以用来显示程序代码如何分解成模块 部署图:描述系统中硬件和软件的物理结构,它描述构成系统架构的软件构件,处理器和设备 用例图:描述系统与外部系统及用 ...
- Python学习记录(一):Anaconda3的安装、配置与使用
简单说下为啥要创建Python虚拟环境呢? 不同的Python工程中用到的包不尽相同,相同包的版本也可能不一样,一种方法是使得各个环境相对独立. 假如说某一个环境崩了,直接remove掉就可以了,不会 ...