反射机制

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. Lombok Pojo默认初始值问题

    Lombok以注解形式来简化java代码,提高开发效率.比如我们常用的@Builder.@Data.@AllArgsConstructor.@NoArgsConstructor.@ToString等. ...

  2. sql语句中where 1=1和 0=1 的作用

    sql where 1=1和 0=1 的作用   where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句. 一.不用where  1=1  在多条件查询中的 ...

  3. 实例分析jdom和dom4j的使用和区别 (转)

    实例分析jdom和dom4j的使用和区别   对于xml的解析和生成,我们在实际应用中用的比较多的是JDOM和DOM4J,下面通过例子来分析两者的区别(在这里我就不详细讲解怎么具体解析xml,如果对于 ...

  4. docker crontab踩坑记录

    环境,docker centos7.4 容器启动时注意两点 入口要设置/usr/sbin/init,并且配置主机完全访问权限(--privileged) (否则执行service的时候会出现Faile ...

  5. sass 插值语句的使用

    定义了一个 px 转 rem 的函数 @function remP($px) { @return $px / (750 / 15) * 1rem; } 在使用 calc 的时候想要使用函数求值的时候遇 ...

  6. polya定理,环形涂色

    环形涂色裸题 #include<iostream> #include<cstdio> #include<algorithm> #include<vector& ...

  7. [BTS] BizTalk WCF-SQL Adapter 高级应用

    9102年岁尾,41岁的我居然还在搞 BizTalk,感觉就是一种悲伤. 国内用户少之又少,能坚持一直在使用的“忠实”用户那就更少了. 不是它不好用,而是微软全线转向云服务,这个产品也已经快10年没有 ...

  8. 浅谈WebView在新窗口浏览网页(setSupportMultipleWindows()与onCreateWindow()关系)

    一,写在前面 我们平常使用电脑浏览器浏览网页可能会有三种方式: 1.新窗口 2.当前窗口种的新选项卡 3.当前选项卡或者窗口 我们知道在电脑系统中同一时间可以开启多个相同的进程,就像你可以同时登陆2个 ...

  9. react+laravel与服务端渲染的几点思考

    一.前后端完全分离 1.用React.js做MVC中的V,剩下的交给Laravel 2.Laravel用来做API接口开发. 3.好处:实现了前后端开发的分离,从而加快前后端开发效率.另外若是多端的如 ...

  10. java+ueditor word粘贴上传

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...