一.认识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反射(一)--认识反射机制的更多相关文章

  1. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  2. JAVA基础 (二)反射 深入解析反射机制

    在谈论到反射这个问题时,你是否有例如以下疑问? 不管是在.NET还是Java中反射的原理和机制是一样的,理解了一种还有一种就能够迎刃而解,想要理解反射首先须要了解底层的一些概念和执行.理解了反射有助于 ...

  3. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  4. Java SE之初探反射机制

    [Keywords]:Java,Hibernate,虚拟机,框架,SQL [Abstract]:   反射的概念:所谓的反射就是java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到 ...

  5. JAVA动态性之一一反射机制reflection

    package com.bjsxt.reflection.test.bean; public class User { private int id; private int age; private ...

  6. Java 核心类库之反射机制

    1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...

  7. Java类加载和类反射回顾

    今天学习Spring,突然想重新复习一下Java类加载和类反射的.巩固一下底层原理.部分参考了李刚老师的<疯狂Java讲义>和陈雄华.林开雄的<Spring3.x企业应用开发实战&g ...

  8. 【GoLang】golang 如何像Java 一样通过类名反射对象?

    结论: golang不支持解析string然后执行. golang的反射机制只能存在于已经存在的对象上面. 不知道后续的版本有没有规划,现在只能先加载注册,然后实现类似Java工厂模式的反射. 代码示 ...

  9. java学习:用反射构造bean

    先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...

  10. 反射那些事儿——Java动态装载和反射技术

    一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...

随机推荐

  1. struts2 基础学习

      Struts 2是在WebWork2基础发展而来的. 注意:struts 2和struts 1在代码风格上几乎不一样. Struts 2 相比Struts 1的优点: 1.在软件设计上Struts ...

  2. ubuntu vim8.1编译安装

    sudo apt-get install libncurses5-dev python-dev python3-dev libgtk-3-dev libatk1.0-dev libbonoboui2- ...

  3. windows10安装docker[含百度网盘docker安装包]

    在win10上安装 docker(比较简单) 安装步骤: 现在 Docker 有专门的 Win10 专业版系统的安装包,需要开启Hyper-V. 1.开启 Hyper-V 程序和功能 启用或关闭Win ...

  4. rabbitmq 客户端崩溃退出

    1.创建1个队列 和 创建另1个独占队列 名称相同 即崩溃退出 2..rabbitmq是为了实现实时消息推送的吗?

  5. django项目中账号注册登陆使用JWT的记录

    需求分析 1.  注册用JWT做状态保持    1.1 安装jwt    pip install djangorestframework-jwt        1.2 去settings里面配置jwt ...

  6. Codeforces 958C3 - Encryption (hard) 区间dp+抽屉原理

    转自:http://www.cnblogs.com/widsom/p/8863005.html 题目大意: 比起Encryption 中级版,把n的范围扩大到 500000,k,p范围都在100以内, ...

  7. Ubuntu新建用户组

    新建用户组 sudo addgroup groupname 把现有用户加入新建的用户组 sudo adduser username groupname

  8. C#基础提升系列——C#文件和流

    C#文件和流 本文主要是对C#中的流进行详细讲解,关于C#中的文件操作,考虑到后期.net core跨平台,相关操作可能会发生很大变化,所以此处不对文件系统(包括目录.文件)过多的讲解,只会描述出在. ...

  9. 【leetcode】1008. Construct Binary Search Tree from Preorder Traversal

    题目如下: Return the root node of a binary search tree that matches the given preorder traversal. (Recal ...

  10. 跨域共享cookie

    1. JSP中Cookie的读写 Cookie的本质是一个键值对,当浏览器访问web服务器的时候写入在客户端机器上,里面记录一些信息.Cookie还有一些附加信息,比如域名.有效时间.注释等等. 下面 ...