承上一篇。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

java反射机制的存在让你只要知道类名就能生成这个类的实例。如果这么说的话,那岂不是违反了java做为面向对象语言的封装性,而且更恐怖的是你还可以得到这个类的属性(public)。但是其实反射机制的存在并不破坏封装新,它虽然可以生成任何类的实例,但是在当前你所在的类,如果想要生成某个类,这个类必须是当前类可见的,那么这个类必须是当前类的成员之一;它虽然能得到属性的值但所得的属性值本身就是public,所以不能说是破坏了封装性。

例子:

public class WTAimObject {

	public String name = "Jobs";

	public String getName(){
return name;
}
}

  

 public class WTGetField {

     public static Object getProperty(Object owner, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
Class ownerClass = owner.getClass(); Field field = ownerClass.getField(fieldName); System.out.println(field.toString()); System.out.println(field.getName()); Object property = field.get(owner);
return property;
} public static void main(String args[]) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException{
WTAimObject aimObject = new WTAimObject(); System.out.println(WTGetField.getProperty(aimObject, "name").toString());
}
}

这个输出结果就是

public java.lang.String WTAimObject.name
name
Jobs

所以课件字段的意思:包含属性名,属性所属类,属性的public,private等;这里注意:如果这个属性是private在field.get(owner)时,会报错,但在field.name()不会。即不能通过field.get(owner);生成实例并获得值。

另一个需要注意的是:执行某个对象的方法,这也是动态代理能实现的基础!


这有一个超级好的例子我就直接搬来啦:

public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {

     Class ownerClass = owner.getClass();

     Class[] argsClass = new Class[args.length];

     for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
} Method method = ownerClass.getMethod(methodName,argsClass); return method.invoke(owner, args);
}

Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

5~9行:配置参数的Class数组,作为寻找Method的条件。

Method method = ownerClass.getMethod(methodName, argsClass):通过methodName和参数的argsClass(方法中的参数类型集合)数组得到要执行的Method。

method.invoke(owner, args):执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值。

这个当中我们可以发现,当我们处理到一个类的定义时,所有的操作都是对这个类的class进行的操作的,这个Class对象是由JVM在运行时创建的,不支持现实和构造,虚拟机为每个类型创建一个读一无二的Class。一般JVM遇到显示新建一个类对象,那么JVM一般会检查是否已经加载该类的Class,如果已经加载就会使用这个Class生成该类的所有对象。

参考Class类 的解释:http://lavasoft.blog.51cto.com/62575/15433/  这个很详细 。

反射机制参考:http://azrael6619.iteye.com/blog/429797

java反射机制的进一步理解的更多相关文章

  1. Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)

    目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...

  2. java反射机制的粗略理解

    java反射机制: 涉及的对象:Class, Object, 函数:Class类:[forName(String className):static:getClass():public],Object ...

  3. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  4. (转)JAVA反射机制理解

    JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...

  5. JAVA反射机制及理解

    JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...

  6. 理解Java反射机制

    理解Java反射机制 转载请注明出处,谢谢! 一.Java反射简介 什么是反射? Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对学习框架技术有很大 ...

  7. Java知识总结:Java反射机制(用实例理解)

    概念理解: 反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来 实现对自己行为的描述( self-representation )和检测( examination) ,并能 ...

  8. 详解Java反射机制

    反射是程序在运行状态下,动态的获取某个类的内部信息的一种操作.例如:类名,包名,所有属性的集合,所有方法的集合,构造方法的集合等.该操作发生在程序的运行时状态,所以编译器管不着有关反射的一些代码,通常 ...

  9. Java反射机制剖析(一)-定义和API

    1.     什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其 ...

随机推荐

  1. GO语言heap剖析及利用heap实现优先级队列

    GO语言heap剖析 本节内容 heap使用 heap提供的方法 heap源码剖析 利用heap实现优先级队列 1. heap使用 在go语言的标准库container中,实现了三中数据类型:heap ...

  2. 修改Linux安装软件镜像源为阿里云

    CentOS系统更换软件安装源: 第一步:安装wget.如果你的系统已安装了wget可以直接跳到下一步. [root@local~]#yum install wget 第二步:备份你的原镜像文件,避免 ...

  3. WebSphere & Log4j

    IBM的东西,真是太麻烦了,一个日志都给你替换掉,太霸道了,Google了下,居然是个普遍想象,不过也有相关的解决方 案,基本好像都是在 WAS5,WAS6.1上的,我没环境,不过我这边的WAS7 没 ...

  4. python 图形化(Tkinter)

    python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.T ...

  5. FastAdmin 推荐 Git 在线学习教程

    FastAdmin 推荐 Git 在线学习教程 因为 FastAdmin 推荐使用 Git 管理代码,有很多小伙伴对 Git 不是很熟悉. 也苦于找不到好的教程,我就分享一个 Git 在线学习教程. ...

  6. 使用ajax技术实现简单登录操作

    1.ajax:特点在web上面通过JavaScript,使用异步的XmlHttp请求,实现无刷新的Web界面 首先:创建ajax对象 再次:向服务器端实现ajax请求 最后:回调 创建异步请求对象 & ...

  7. Asp.net工作流workflow实战之给书签命名(四)

    之前我们的书签名字是通过手动录入的方式,在实际开发中要在流程设计的时候定义好: namespace EazyBPMS.WorkFlow { public sealed class SetStepAct ...

  8. Asp.net工作流workflow实战之工作流启动与继续(三)

    工作流帮助类: //让工作流继续沿着书签的位置向下执行value是向书签传递参数 wfc.ResumeBookmark(bookmarkName,value); //把传过来的数据value作为输出参 ...

  9. 开启VMSS Autoscale的报警功能

    VMSS可以自动的实现Scale Out和Scale in.在VMSS做自动操作的时候,可以通过配置通知服务,通知VMSS的状态. 具体实现方式: 1, 在portal中选择"监视器&quo ...

  10. Linux SPI驱动(一)

    转载:http://www.cnblogs.com/lknlfy/p/3265019.html (原作者注:)根据我个人所知道的,Linux SPI一直是处于被“忽略”的角色,市场上大部分板子在板级文 ...