Java的的反射机制,是一个很难但却比较有用的概念。反射机制经常出现在框架设计中,大神说:反射是框架设计的灵魂,也就是说要想看懂框架的源代码,必须得掌握反射机制。

  作为初学者的我,觉得至少应该掌握它日常得几种用法。下面,继续接地气,说说反射机制的应用。

一、什么是Java Reflection?

  反射机制,是指程序在运行过程中借助Reflection API来取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。

  注意:一定是运行过程中,不过这也很容易理解,“反射”凭感觉就可以认为这是一个动态的机制。关于反射机制,在Java中涉及到一个类——Class类。程序从源代码编写到执行的过程,如下图(图片来源于网络):

  反射机制的使用前提:必须先得到字节码,前面所提的Class类就是用于表示.class文件(字节码)

二、反射机制的作用

  1.在运行时判断任意一个对象所属的类

  2.在运行时构造任意一个类的对象

  3.在运行时判断任意一个类所具有的成员变量和方法

  4.在运行时调用任意一个对象的成员变量和方法

  5.生成动态代理(比较难)

  Reflection API:(主要的API)

  反射的目的,就是要在程序运行时把类中的各种成分(如属性,构造方法,方法等等)分解成一个个的对象。那么,首先应该获取到‘类’,方法主要有三种,严格来讲有四种,而java.lang.Class这个类主要就是用来分解类中的对象。

    接下来分析,获取运行时类的三种重要方式。

  记住,得到的运行时类就是Class类型的实际对象,Class这个类是没有公共的构造方法的。

方法一:Class类中的静态方法forName("类名") ,已知Person是一个定义好的类,下同。

Class cs = Class.forName("Person");

  方法二:Object超类中的getClass()方法

Person p=new Person(18,"90");
Class cs1 =p.getClass();

  方法三:任何数据类型(包含基本数据类型)都有一个静态属性class

Person p=new Person(18,"90");
Class cs2 =Person.class;

  Class自己本身是一个类,由于它没有公开的构造方法,因此它的对象只能由系统建立,并且任何一个类在JVM中只有一个实例。实际上一个Class对象对应

的是一个加载到JVM中的一个.class文件;每个类的实例都会记得自己是由哪个 Class 实例所生成;通过Class对象可以得到其对应类完整的结构。

  Class有许多方法,使用时需要参照API文档。

  这里省略Method、Constructor、Field等类的介绍,参照API,那是权威。哈哈!

三、反射的应用

  主要应用于动态代理,代理是一种设计模式,还有静态代理,静态代理比较常见。

  首先学习一下静态代理(代理实现的一般模式):首先创建一个接口(JDK代理都是面向接口的),然后创建具体实现类来实现这个接口,在创建一个代理

类同样实现这个接口,不同之处在于,具体实现类的方法中需要将接口中定义的方法的业务逻辑功能实现,而代理类中的方法只要调用具体类中的对应方法即

可,这样我们在需要使用接口中的某个方法的功能时直接调用代理类的方法即可,将具体的实现类隐藏在底层。

 package com.rdst.staticDL;
//静态代理模式
//接口
interface ClothFactory{
void productCloth();
}
//被代理类
class NikeClothFactory implements ClothFactory{
@Override
public void productCloth() {
System.out.println("Nike工厂生产一批衣服");
}
}
//代理类
class ProxyFactory implements ClothFactory{
ClothFactory cf;
//创建代理类的对象时,实际传入一个被代理类的对象
public ProxyFactory(ClothFactory cf){
this.cf = cf;
} @Override
public void productCloth() {
System.out.println("代理类开始执行,收代理费$1000");
cf.productCloth();
} } public class TestClothProduct {
public static void main(String[] args) {
NikeClothFactory nike = new NikeClothFactory();//创建被代理类的对象
ProxyFactory proxy = new ProxyFactory(nike);//创建代理类的对象
proxy.productCloth();
}
}

  看见没,静态代理是在编译前就将接口、实现类、代理类一股脑儿全部手动完成。

  再来学习一下动态代理:动态代理的思维模式与之前的静态代理是一样的,也是面向接口进行编码,创建代理类将具体类隐藏解耦,不同之处在于代理类的

创建时机不同,动态代理需要在运行时因需实时创建。 

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理的使用,体会反射是动态语言的关键
interface Subject {
void action();
}
// 被代理类
class RealSubject implements Subject {
public void action() {
System.out.println("我是被代理类!");
}
}
class MyInvocationHandler implements InvocationHandler {
Object obj;// 实现了接口的被代理类的对象的声明 // ①给被代理的对象实例化②返回一个代理类的对象
public Object blind(Object obj) {
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this);
}
//当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下的invoke方法的调用
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//method方法的返回值时returnVal
Object returnVal = method.invoke(obj, args);
return returnVal;
}
}
public class TestProxy {
public static void main(String[] args) {
//1.被代理类的对象
RealSubject real = new RealSubject();
//2.创建一个实现了InvacationHandler接口的类的对象
MyInvocationHandler handler = new MyInvocationHandler();
//3.调用blind()方法,动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象。
Object obj = handler.blind(real);
Subject sub = (Subject)obj;//此时sub就是代理类的对象
sub.action();//转到对InvacationHandler接口的实现类的invoke()方法的调用
//再举一例
NikeClothFactory nike = new NikeClothFactory();
ClothFactory proxyCloth = (ClothFactory)handler.blind(nike);//proxyCloth即为代理类的对象
proxyCloth.productCloth();
}
}

  面向对象编程的多态,代理的核心知识还是向上转型。

Java的反射机制(应用篇)的更多相关文章

  1. java的反射机制(第二篇)

    本文转载自:http://c.biancheng.net/cpp/html/1781.html 要理解RTTI在Java中的工作原理,首先必须知道类型信息在运行时是如何表示的,这项工作是由“Class ...

  2. java的反射机制(第三篇)

    本文转载自:http://c.biancheng.net/cpp/html/1782.html Person p=new Person();这是什么?当然是实例化一个对象了.可是这种实例化对象的方法存 ...

  3. Java高级特性——反射机制(第一篇)

    ——何为动态语言,何为静态语言?(学习反射知识前,需要了解动态语言和静态语言) 动态语言 >是一类在运行时可以改变其结构的语言,例如新的函数.对象.甚至是代码可以被引进,已有的函数可以被删除或者 ...

  4. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  5. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  6. 深入浅出学习hibernate框架(三):java的反射机制

    上篇博客写到了JDBC的基本操作,今天准备写一篇关于JAVA反射机制的文章,因为java的反射机制和上一篇JDBC都是Hibernate框架的基本要素.在Hibernate的运行机制中,这两块的内容正 ...

  7. 014 Java的反射机制

    作者:nnngu GitHub:https://github.com/nnngu 博客园:http://www.cnblogs.com/nnngu 简书:https://www.jianshu.com ...

  8. java的反射机制

    一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  9. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  10. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

随机推荐

  1. apache重定向无效

    这个问题让我纠结了蛮久啊,因为之前一直不注意SEO,网站带www和不带www的一级域名都被收录了,而且不知道为什么不带www的一级域名被收录比www还多,这可不是我的初衷!这次吸取教训了,以后再开站不 ...

  2. 8148 8168 中移植live55 出现except rtsp 中途莫名的断流

    在解码中,接了浙江宇视的ipc相机,解码一般就挂了,vlc 也是中途断流.费解? vlc异常信息如下: packetizer_h264 warning: waiting for SPS/PPS pac ...

  3. mysql中的乐观锁和悲观锁

    mysql中的乐观锁和悲观锁的简介以及如何简单运用. 关于mysql中的乐观锁和悲观锁面试的时候被问到的概率还是比较大的. mysql的悲观锁: 其实理解起来非常简单,当数据被外界修改持保守态度,包括 ...

  4. WCF基础之序列化

    wcf是基于消息进行通信的,这篇就是简单说下序列化引擎是如何将.net object转化为xml消息.一般情况下很少用到这些,你只需定义数据协定之类的或者指定相应的序列化引擎,然后设置相应的特性就好. ...

  5. 找出旋转有序数列的中间值python实现

    题目给出一个有序数列随机旋转之后的数列,如原有序数列为:[0,1,2,4,5,6,7] ,旋转之后为[4,5,6,7,0,1,2].假定数列中无重复元素,且数列长度为奇数.求出旋转数列的中间值.如数列 ...

  6. mysql存储引擎(待补充)

    数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎 存储引擎说白了就是如何存取数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在 ...

  7. php面向对象加载类

    php加载类: 新建php文件用驼峰法命名类名: 每个单词首字母大写,后面加.class.php表示这是php类文件.例如: ClubMember.class.php 若为纯php页面,<?ph ...

  8. android OTA升级包制作【转】

    本文转载自:http://www.thinksaas.cn/topics/0/445/445670.html 0.签名 java -Xmx2048m -jar out/host/linux-x86/f ...

  9. HDFS常见问题

    在HDFS里面,data node上的块大小默认是64MB(或者是128MB或256MB) 问题: 为什么64MB(或128MB或256MB)是最优选择? 为什么不能远少于64MB(或128MB或25 ...

  10. ThinkPHP的Auth类认证

    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比RBAC更方便 .  RBAC是按节点进行认证的,如果要控制比节点更细的权限就有点困难了 ...