反射之中所有的核心操作都是通过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类实例化和对象的反射实例化的更多相关文章

  1. java学习笔记07--日期操作类

    java学习笔记07--日期操作类   一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...

  2. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  3. Java学习笔记(二)——类和对象

    [1]类是模子,确定对象将会拥有的特征(属性)和行为(方法). [2]类的特点:类是对象的类型: 具有相同属性和方法的一组对象的集合. [3]属性:对象具有的各种特征(每个对象的每个属性都拥有特定值) ...

  4. java学习笔记17(Calendarl类)

    Calendar类:(日历) 用法:Calendar是一个抽象类:不能实例化(不能new),使用时通过子类完成实现,不过这个类不需要创建子类对象,而是通过静态方法直接获取: 获取对象方法:getIns ...

  5. Java学习笔记【四、类、对象、接口】

    编程语言的发展 机器语言 过程语言 面向对象编程--封装.继承.多态 关键字 extends implements override overload super this static abstra ...

  6. Java学习笔记七——数组工具类Arrays

    数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> ...

  7. 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 ...

  8. Java学习笔记26(Math类、Arrays类、BigInteger类、BigDecimal类)

    Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即 ...

  9. Java学习笔记25(System类)

    System类,系统类,包含的是静态方法,无法创建对象 这里介绍几个简单的方法,其他一些在后边用到的时候会讲 类方法: currentTimeMillis():获取当前毫秒数 package demo ...

  10. Java学习笔记24(Integer类)

    这里介绍基本数据类型包装类,Integer是int的包装类, 其他的基本数据类型的包装类的方法和Integer的方法几乎一致,会一种即可全会 基本数据类型包装类的特点:用于在基本数据类型和字符串之间进 ...

随机推荐

  1. Day6前端学习之路——布局

    一.定位 1)静态定位  position:static(默认) 2)相对定位 position:relative(要配合top.bottom.left.right等属性来使用) 3)绝对定位 pos ...

  2. div中元素水平居中的方法

    使用align属性 <div class="main" align="center">        <h1>MAIN</h1&g ...

  3. everspin最新1Gb容量扩大MRAM吸引力

    everspin提供了8/16-bit的DDR4-1333MT/s(667MHz)接口,但与较旧的基于DDR3的MRAM组件一样,时序上的差异使得其难以成为DRAM(动态随机存取器)的直接替代品.   ...

  4. ACM 英文学习系列

    因为ACM题目描述全是英文,所以有必要学习学习相关词汇...内心极为无奈 废话不多说 rooted binary tree 有根二叉树     integers n 英[ˈɪntɪdʒəz] 整数   ...

  5. Android中动态改变Listview中字体的颜色

    效果如下: 账目显示用的是Listview,要实现的功能为使其根据所在Item是“收入”还是“支出”来把数字设置成绿色或红色 方法是自定义适配器,并重写其中getView()函数,实现如下: //自定 ...

  6. cf1280B

    题意:给出一个n*m的矩阵,矩阵中的元素要么P要么是A 每次可以选择一个的子矩形,然后将矩阵中每一行都变为第一行,或者将矩阵中每一列都变为第一列 要求用最少的次数将矩阵中所有元素都变成A 题解:分类讨 ...

  7. P1967 货车运输【LCA】【生成树】

    题目描述 A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的 ...

  8. Python3 协程相关 - 学习笔记

    什么是协程 协程的优势 Python3中的协程 生成器 yield/send yield + send(利用生成器实现协程) 协程的四个状态 协程终止 @asyncio.coroutine和yield ...

  9. Mysql字符串截取,去掉时间,匹配日期等于今日

    Mysql字符串截取,去掉时间,匹配日期等于今日 方案一 select time from jsb where date(time)=date(now()); 方案二 ));

  10. [Python]PyCharm中%matplotlib inline报错

    %matplotlib作用 是在使用jupyter notebook 或者 jupyter qtconsole的时候,才会经常用到%matplotlib,也就是说那一份代码可能就是别人使用jupyte ...