反射机制

1,反射机制简介

  在Java语言里面之所以会有如此多的开源技术支撑,很大的一部分是来自于Java最大的特征【反射机制】。如果你不能够使用反射机制去进行项目的开发与设计,那么可以说你并未接触到Java的精髓。

  所有技术实现的目标只有一点【重用性】

  对于反射技术首先来考虑的是“反”与“正”的操作,所谓的“正”的操作是

  当我们要使用一个类的时候,一定要先导入程序所在的包,而后根据类进行对象的实例化并且调用类中的方法。但是如果说“反”,根据实例化对象反推出其类型。

  ·范例:正向操作

 /**
* 正向操作的一般流程
*/
package cn.mufasa.demo;
import java.util.Date;//①先导入程序所在的包,知道对象的出处
public class JavaAPIDemo1 {
public static void main(String[] args) {
Date date=new Date();//②通过类产生实例化对象
System.out.println(date.getTime());//③根据对象调用类中的方法
}
}

  如果想要实现“反”操作,那么首先要采用的是Object类中所提供的一个方法:

  获取类信息——>public final Class<?> getClass();

  ·范例:观察Class对象的使用

 package cn.mufasa.demo;
import java.util.Date;
public class JavaAPIDemo2 {
public static void main(String[] args) {
Date date=new Date();
System.out.println(date.getClass());//根据实例化对象找到对象类型
}
}

  getClass()可以帮助使用者找到对象的根源。

2,Class类对象的三种实例化模式

  反射之中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类如果想要获取它的实例化对象,可以采用【三种方式】完成,首先来观察java.lang.Class类的定义

 public final class Class<T> extends Object
implements Serializable, GenericDeclaration, Type, AnnotatedElement

  在JDK1.5开始Class类在定义的时候可以使用泛型进行标记,这样的用法主要是希望可以避免所谓的向下转型。下面通过具体的操作讲解三种实例化形式。

  ①【Object类支持】Object类可以根据实例化对象获取Class对象:public final Class<?> getClass()

  这种方式有一个不是缺点的缺点???:如果现在只是想要获得Class类对象,则必须产生指定类对象后才可以获得;会造成无用的对象产生::备注下面代码需要额外创建一个Person类

 package cn.mufasa.demo;
public class JavaAPIDemo3 {
public static void main(String[] args) {
Person per=new Person();//已经存在指定类的实例化对象
Class<? extends Person> cls=per.getClass();
System.out.println(cls);
System.out.println(cls.getName());//获取类的完整名称
}
}
/*输出
class cn.mufasa.demo.Person
cn.mufasa.demo.Person
*/
 package cn.mufasa.demo;
public class Person {
}

  ②【JVM直接支持】采用“类.class”的形式实例化

  ·特定:如果要采用此种模式,必须要导入程序所对应的开发包。

 package cn.mufasa.demo;
public class JavaAPIDemo4 {
public static void main(String[] args) {
Class<? extends Person> cls=Person.class;//没有进行实例化
System.out.println(cls.getName());
}
}
/*输出
cn.mufasa.demo.Person
*/

  ③【Class类支持】在Class类中提供有一个static方法:

public static Class<?> forName(String className) throws ClassNotFoundException;
 package cn.mufasa.demo;
public class JavaAPIDemo5 {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> cls=Class.forName("cn.mufasa.demo.Person");//需要导入开发包
System.out.println(cls.getName());
}
}
/*输出
cn.mufasa.demo.Person
*/

  这种模式最大的特定是可以直接采用字符串的形式定义要使用的类型,且程序之中不需要编写任何import语句。如果此时要导入的程序类不存在则会抛出【java.lang.ClassNotFoundException 】异常。

  全部都要使用!!!

进阶Java编程(7)反射机制的更多相关文章

  1. 进阶Java编程(13)反射与Annotation

    1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...

  2. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...

  3. 进阶Java编程(9)反射与类操作

    1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...

  4. 进阶Java编程(8)反射应用案例

    1,反射实例化对象 经过一系列分析之后可以发现虽然获得了Class类的实例化对象但是依然觉得这个对象获取的意义不是很大,所以为了进一步的帮助大家理解反射的核心意义所在,下面将通过几个案例进行说明(都是 ...

  5. java学习--Reflection反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...

  6. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  7. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  8. Java中的反射机制和动态代理

    一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象 ...

  9. 小白都能学会的Java注解与反射机制

    前言 Java注解和反射是很基础的Java知识了,为何还要讲它呢?因为我在面试应聘者的过程中,发现不少面试者很少使用过注解和反射,甚至有人只能说出@Override这一个注解.我建议大家还是尽量能在开 ...

随机推荐

  1. 【零基础】简单说说一键果体APP的AI

    参考: https://www.jianshu.com/p/8c7a7cb7198c https://blog.csdn.net/gdymind/article/details/82696481 零. ...

  2. Python中的变量、对象

    由于没时间系统学习下Python 只能见一个问题探究一个问题了 一.初级 - 对象 关于Python中的数据类型,今天重新认识了下.[参考] 首先,Python中,对象才有类型, 变量是没有类型的,它 ...

  3. android data binding jetpack VII @BindingAdapter

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  4. npm 权限

    将npm默认目录定向到其他你具有读写权限的目录 很多时候你可能并不想改变npm所用的默认目录(如/usr)的拥有者,因为这可能会导致一些问题,比如你在与其他用户共用此系统时. 这时,你可以设置npm整 ...

  5. ubuntu19.04 安装workbench

    1.首先下载安装这两个包: https://packages.ubuntu.com/cosmic/amd64/libssl1.0.0/download https://packages.ubuntu. ...

  6. error: atomic: 没有那个文件或目录

    Linux下编译的时候遇到一个问题,就是提示    error: atomic: 没有那个文件或目录 执行的命令是gcc -o myCXXLog myCXXLog.c 经过网上搜索,解决方法有二 (1 ...

  7. 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务

    笔记 5.微服务调用方式之feign 实战 订单调用商品服务     简介:改造电商项目 订单服务 调用商品服务获取商品信息         Feign: 伪RPC客户端(本质还是用http)    ...

  8. Kafka 和 ZooKeeper 的分布式消息队列分析

    1. Kafka 总体架构 基于 Kafka-ZooKeeper 的分布式消息队列系统总体架构如下: 如上图所示,一个典型的 Kafka 体系架构包括若干 Producer(消息生产者),若干 bro ...

  9. Linux显存占用无进程清理方法(附批量清理命令)

    在跑TensorFlow.pytorch之类的需要CUDA的程序时,强行Kill掉进程后发现显存仍然占用,这时候可以使用如下命令查看到top或者ps中看不到的进程,之后再kill掉: fuser -v ...

  10. svn本地文件颜色详解

    1.红色感叹号表示这个文件从服务器上下载下来以后,在本地被修改过.这时执行提交操作就可以了.2.黄色感叹号表示这个文件在提交的时候发现存在冲突,也就是说有别人在你提交之前对这个文件的同一个版本进行了修 ...