java反射(一)--认识反射机制
一.认识java反射机制
在java语言中,之所以会有如此众多的开源技术支撑,很大的一部分来源于java最大特征--反射机制.能够灵活的去使用反射机制进行项目的开发与设计,才能够真正接触到java的精髓.所有的技术实现的目标只有一点:重用性.
--对于反射技术,首先应该考虑"反"与"正"的概念,所谓的"正"操作指的是当你要使用一个类的时候,要先导入程序所在的包,而后根据类进行对象的实例化,并且依靠对象调用类中的方法.但是"反"则为,根据实例化对象,反推出其类型.
--范例:正向操作
package 反射.认识反射机制; import java.util.Date; //1.当如程序所在的包,知道对象的出处 /**
* @author : S K Y
* @version :0.0.1
*/
public class Demo {
public static void main(String[] args) {
Date date = new Date(); //2.通过类产生实例化对象
System.out.println(date.getTime()); //3.根据对象调用类中的方法
}
}
--如果想要实现"反"的操作,那么首先要采用的就是Object类中所提供的操作方法:public final native Class<?> getClass()
--范例:观察getClass()的应用
public class GetClassDemo {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date.getTime());
//根据实例化对象得到其所属的类型
System.out.println("date: " + date.getClass());
}
}
--运行结果
1566916084454
date: class java.util.Date Process finished with exit code 0
二.Class类对象的三种实例化方式
反射之中的所有的核心操作都是通过Class类对象展开的,Class类是反射操作的根源所在,但是这个类如果要想获取他的实例化对象,可以采用三种方式完成,首先观察Class类的定义:
public final class Class<T> implements java.io.Serializable,
GenericDeclaration,
Type,
AnnotatedElement
--从JDK1.5开始Class类在定义的时候可以使用泛型进行标记,这样的用法主要啊是希望可以避免所谓的向下转型.
--1.Object类支持,Object类可以根据实例化对象获取Class对象:public final native Class<?> getClass()
public class ClassDemo {
public static void main(String[] args) {
Person person = new Person(); //已经存在有指定类的实例化对象
Class<? extends Person> cls = person.getClass();
System.out.println(cls);
System.out.println(cls.getName()); //获取类的完成名称
}
}
--这种方式存在一个不是缺点的缺点:如果现在只是想获得Class类对象,则必须产生指定类对象后才可以获得.
--2.JVM直接支持:采用类.class的形式实例化:此种形式需要导入类所在的开发包
public class ClassDemo {
public static void main(String[] args) {
Class<? extends Person> cls = Person.class;
System.out.println(cls);
System.out.println(cls.getName()); //获取类的完成名称
}
}
--3.Class类支持,在Class类中提供有一个操作的static方法:public static Class<?> forName(String className)throws ClassNotFoundException:
public class GetClassDemo {
public static void main(String[] args) throws ClassNotFoundException {
//此时Person类位于 entity包中
Class<?> aClass = Class.forName("反射.认识反射机制.entity.Person");
System.out.println(aClass);
}
}
--这种模式最大的特点是可以直接采用字符串的形式定义要使用的类型,并且程序中不需要编写任何的import语句,如果此时无法找到要使用的程序类,则会出现如下异常
Exception in thread "main" java.lang.ClassNotFoundException: 反射.认识反射机制.entity.A
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at 反射.认识反射机制.GetClassDemo.main(GetClassDemo.java:12) Process finished with exit code 1
java反射(一)--认识反射机制的更多相关文章
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
- JAVA基础 (二)反射 深入解析反射机制
在谈论到反射这个问题时,你是否有例如以下疑问? 不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行.理解了反射有助于 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- Java SE之初探反射机制
[Keywords]:Java,Hibernate,虚拟机,框架,SQL [Abstract]: 反射的概念:所谓的反射就是java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到 ...
- JAVA动态性之一一反射机制reflection
package com.bjsxt.reflection.test.bean; public class User { private int id; private int age; private ...
- Java 核心类库之反射机制
1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...
- Java类加载和类反射回顾
今天学习Spring,突然想重新复习一下Java类加载和类反射的.巩固一下底层原理.部分参考了李刚老师的<疯狂Java讲义>和陈雄华.林开雄的<Spring3.x企业应用开发实战&g ...
- 【GoLang】golang 如何像Java 一样通过类名反射对象?
结论: golang不支持解析string然后执行. golang的反射机制只能存在于已经存在的对象上面. 不知道后续的版本有没有规划,现在只能先加载注册,然后实现类似Java工厂模式的反射. 代码示 ...
- java学习:用反射构造bean
先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...
- 反射那些事儿——Java动态装载和反射技术
一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...
随机推荐
- python 模块和包深度学习理解
python 模块和包 简单说相当于命名空间 1,python 模块 python模块就是一个文件,里面有函数,变量等 import 模块 模块.方法 from 模块 import fu ...
- 学python2.7简单还是python3.0简单,两者区别
学python2.7简单还是python3.0简单,谈谈两者区别 1. 使用__future__模块 Python 3.X 引入了一些与Python 2 不兼容的关键字和特性.在Python 2中,可 ...
- C#实现百度ping功能
网站优化必做的事情之一,百度ping,主动推送给百度 文章添加时调用百度推送方法 //保存 protected void btnSubmit_Click(object sender, EventArg ...
- Web前端基础学习-1
HTML5/CSS简介 首先来说一说什么是HTML5,HTML5可以认为是字面上的意义,也就是HTML的第五代产品,当然从另一个角度来说它是一种新的富客户端解决方案. HTML5 将成为 HTML.X ...
- rabbitMQ实现推迟队列
一. 使用原生Api 1.RabbitMQ 相关 <dependency> <groupId>com.rabbitmq</groupId> <artifact ...
- 2018-4-30-win2d-CanvasRenderTarget-vs-CanvasBitmap
title author date CreateTime categories win2d CanvasRenderTarget vs CanvasBitmap lindexi 2018-04-30 ...
- 阿里云LNMP环境安装
文档里有一键部署LNMP环境和手动搭建LNMP环境您看下 镜像部署 LNMP 环境:https://help.aliyun.com/document_detail/25427.html?spm=517 ...
- HDU 5634 线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5634 题意:给定一个长度为n的序列,有m次操作.操作有3种: 1 l,r :区间[l,r]的值变成ph ...
- Flutter-AppBar
1.1 简介 AppBar “应用栏” 应用栏由工具栏组成,或者是工具栏和其他 widget 组合形成,例如 TabBar和FlexibleSpaceBar; 应用栏通常用于 Scaffold.app ...
- [CSP-S模拟测试]:physics(二维前缀和+二分+剪枝)
题目传送门(内部题26) 输入格式 第一行有$3$个整数$n,m,q$.然后有$n$行,每行有一个长度为$m$的字符串,$+$表示正电粒子,$-$表示负电粒子.然后有$q$行,每行$2$个整数$x,y ...