反射机制

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. windows下手动安装composer

    原文地址:http://www.cnblogs.com/JANCHAN/p/7735882.html 1.下载compser.phar 地址 https://getcomposer.org/downl ...

  2. FreeMarker学习(常用表达式)

    直接指定值 字符串: "Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者 'It\'s "quoted& ...

  3. springboot发送邮件,以及携带邮件附件简单使用

    可以通过springboot官方文档中Sending Email,找到类似如下java mail的使用文档 https://docs.spring.io/spring/docs/5.1.9.RELEA ...

  4. win10下EditPlus不能拖拽打开文件

    今天找到篇blog,终于把win10下EditPlus不能拖拽打开文件的问题解决了:) 记录下备忘.之前通过注册表的方式添加到右键菜单,当时设置了EditPlus以管理员身份运行: 解决办法=> ...

  5. kotlin if

    val max = if (a > b) { print("Choose a") a } else { print("Choose b") b } 注意和 ...

  6. Jmeter使用实践-接口diff测试

    Jmeter使用实践-接口diff测试 大多数人都使用 Jmeter 做过性能测试,但是在使用的过程中你会发现,它不仅可以做性能测试和功能测试,还能够满足基本的接口测试需求. 相比其他工具,Jmete ...

  7. [ML] Feature Selectors

    SparkML中关于特征的算法可分为:Extractors(特征提取).Transformers(特征转换).Selectors(特征选择)三部分. Ref: SparkML中三种特征选择算法(Vec ...

  8. MongoDB Input

    Configure Connection Tab Host name(s) or IP address(es):网络名称或者地址.可以输入多个主机名或IP地址,用逗号分隔.还可以通过将主机名和端口号与 ...

  9. phoenix创建表失败:phoenixIOException: Max attempts exceeded

    下面的问题,搞了1天才解决,太坑了,在这里记录一下. 问题现像:执行命令后,1分钟没有返回, 然后报下面的错,偶尔会出现以下不同的报错信息. jdbc:phoenix:10.0.xx.1:2181&g ...

  10. 树莓派-为Ubuntu Mate更换国内源 [转]

    更换步骤以root身份打开 /etc/apt/sources.list    将 http://ports.ubuntu.com/ 全部替换为中科大的源 http://mirrors.ustc.edu ...