进阶Java编程(7)反射机制
反射机制
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)反射机制的更多相关文章
- 进阶Java编程(13)反射与Annotation
1,反射取得Annotation信息 从JDK1.5之后Java提供了Annotation技术支持,这种技术为项目的编写带来了新的模型,而后经过了十年的发展,Annotation的技术得到了非常广泛的 ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- 进阶Java编程(9)反射与类操作
1,反射获取类结构信息 在反射机制的处理过程之中不仅仅只是一个实例化对象的处理操作,更多的情况下还有类的组成结构操作,任何一个类的基本组成结构:父类(父接口).包.属性.方法(构造方法与普通方法). ...
- 进阶Java编程(8)反射应用案例
1,反射实例化对象 经过一系列分析之后可以发现虽然获得了Class类的实例化对象但是依然觉得这个对象获取的意义不是很大,所以为了进一步的帮助大家理解反射的核心意义所在,下面将通过几个案例进行说明(都是 ...
- java学习--Reflection反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- Java中的反射机制和动态代理
一.反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法:对于任意一个对象 ...
- 小白都能学会的Java注解与反射机制
前言 Java注解和反射是很基础的Java知识了,为何还要讲它呢?因为我在面试应聘者的过程中,发现不少面试者很少使用过注解和反射,甚至有人只能说出@Override这一个注解.我建议大家还是尽量能在开 ...
随机推荐
- docker部署TX-LCN5.0.2
主要是在配置tx-lcn.manager.host时需要特别注意下,应该安装如下配置进行 tx-lcn: manager: host: 0.0.0.0 port: 8070 heart-time: 1 ...
- maven坐标及依赖范围的学习(1)
首先,我们先了解什么是maven的坐标(重中之重): 在这里我们可以看到那三个红色的行,基本是pom.xml中出现的最多的配置 例如这个配置:这里我们可以看到我们这个项目的pom文件中,他对名 ...
- 2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础
目录 基础问题 实验目的 实验内容 实验步骤 实验总结与体会 实验目的 本实践的目标理解常用网络攻击技术的基本原理. 返回目录 实验内容 WebGoat准备工作 SQL注入攻击 命令注入(Comman ...
- Netfilter 之 连接跟踪初始化
基础参数初始化 nf_conntrack_init_start函数完成连接跟踪基础参数的初始化,包括了hash,slab,扩展项,GC任务等: int nf_conntrack_init_start( ...
- 使用PYTHON统计项目代码行数
目录 一 使用PYTHON统计项目代码行数 二 应用实例 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 使用PYTHON统计项目代码行数 遇到一个非常小的需求:统计一个项目里头的各类源代码 ...
- Oracle 中的进制转换
Oracle 中的进制转换 */--> Oracle 中的进制转换 Table of Contents 1. 进制名 2. 10进制与16进制互相转换 2.1. 10进制转换为16进制 2.2. ...
- python之scrapy模块pipelines
1.知识点 """" pipelines使用: 1.在spiders里面使用yield生成器 list_li = response.xpath("// ...
- RabbitMQ学习之:(七)Fanout Exchange (转贴+我的评论)
From:http://lostechies.com/derekgreer/2012/05/16/rabbitmq-for-windows-fanout-exchanges/ PunCha: Ther ...
- RabbitMQ学习之:(十二)在Node.js环境下使用RabbitMQ
学,以致用.找了半天Node.js下RabbitMQ的库,看上去都不太趁手,直到最后找到了amqp库,看上去倒还不错,照着例子,写了第一个RabbitMQ的客户端. 首先,使用 npm install ...
- Djang之ModelForm组件的简单使用
ModelForm组件的简单使用 models.py from django.db import models class UserInfo(models.Model): username = mod ...