`
wangjie2013
  • 浏览: 173466 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java反射技术

    博客分类:
  • JAVA
阅读更多

java反射技术

 

Last modified:2013-04-06 23:45:44

***************************************

 

获得Class对象的方法:

Person.class:类名.class

new Person().getClass():对象.getClass()

Class.forName("java.lang.String"):Class.forName(完整类名)。(作用:获得类的字节码。有两种情况:如果这个类在内存中,则直接返回;如果内存中没有则通过类加载器加载到虚拟机内存中。以后要得到这个字节码就不用再加载了。在反射中主要使用这种方法,因为在写源程序的时候还不知道类的名字,也就是说我们可以使用一个变量来代替。)

 

一个字节码可以创建出多个实例对象来。

 

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 

 

只要是类型就对应一个Class实例对象。有九个预定义的Class对象:八个基本类型加一个void(空类型)。

Primitive Data Type:原生数据类型。

 

int.class.isPrimitive():isPrimitive(原始的)是否是基本数据类型。

 

Integer.TYPE:代表他所包装的那个基本数据类型的那份字节码,也就是基本数据类型的 Class对象(int.class)

 

数组不是基本数据类型(Primitive Data Type),是引用类型,判断是否是数组可以使用:isArray();

 

总之,只要是在源程序中出现的类型,都有各自的一份Class实例对象,例如:int[],void,String,int ……

 

反射(Reflect)

反射:就是把java类中的各种成分映射成相应的java类

例如:一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类,表示java类的Class类显然要提供依系列的方法,来获得其中的变量,方法,构造函数,修饰符,包等信息,这些信息就是用相应类的实例对象表示,它们是Field,Method,Contructor,Package等等。

 

通过反射,我们可以得到各个类中相应成分的Class对象。

 

编译时与运行时的区别:

编译时,检查代码的语法错误。不能检查逻辑错误!

运行时,如果代码存在逻辑错误,那么就会报错。

 

Alt+shift+s:快速生成代码。

 

Constructor:

我们可以通过反射创建对象。

String str = new String("abc");

 

String str = 

(String) String.class.getConstructor(StringBuffer.class)

.newInstance(new StringBuffer("abcde"));

 

如果通过空参数的构造方法创建一个对象,还可以通过Class.newInstance()方法。

例如:

String str = 

(String)Class.forName("java.lang.Stirng").newInstance();

 

Field:

获得Field类对象:Field field = pt1.class.getField("字段名");

获得某个实例的字段值:field.get(pt1);

 

getField方法不能获得私有字段,想要获得可以通过getDeclaredField("字段名")(不论该字段可见不可见都能获得该字段的对象)。想要获取字段的值,可以先执行field.setAccessible(ture);然后再get(pt1),这就是所谓的暴力反射。

英文词汇:declared:声明的;Accessible:可接近,可到达;

 

 

  public static void changeChar(Object obj) throws Exception {
      Field[] fields = obj.getClass().getDeclaredFields();//能看见所有的字段,包括私有的。
      for (Field field : fields) {
          if (field.getType() == String.class) {
              field.setAccessible(true);//暴力反射;
              String oldValue = (String) field.get(obj);
              String newValue = oldValue.replace('a', 'b');
              field.set(obj, newValue);
          }
      }
 }

 

对字节码的比较用“==”!当然用equals也可以。但是“==”更加合适!因为是同一份字节码。

 

Method:

方法与对象是没有关系的。我们通过获得方法对象后,再通过这个方法对象调用某个类执行这个方法。也就是先得到这个方法,然后在针对某个对象去调用这个方法。

 

通过反射的方式获得某个字节码里的方法对象,再用这个方法对象去作用于某个对象。 

 

invoke:恳求;

调用方法:

通常:str.charAt(1);

反射:

Method methodCharAt =Class.forName("java.lang.String").getMethod("charAt",int.class);
  methodCharAt.invoke(str,1);
   

 

由方法去调用对象执行该方法。这是面向对象的思维模式,其实只是这个方法对象给str对象发出了一个恳求,请求被执行。之后str对象就发出一个执行该方法的信号。比如:司机刹车,司机其实是踩了刹车板,给汽车发了一个信号,汽车就进行刹车。到底是如何将车停下的,汽车的刹车方法最清楚这里就是方法恳求被执行,对象发出信号执行它!

 

注意:如果Method对象第一个参数为null,说明这个Method对象对应一个静态方法。

分享到:
评论

相关推荐

    JDBC_Java反射技术入门

    在这个“JDBC_Java反射技术入门”资源中,初学者可以了解到如何使用Java进行数据库操作的基础知识,包括连接数据库、执行SQL语句、处理查询结果等。 1. **JDBC基础**: - **加载驱动**:在使用JDBC之前,我们需要...

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    java反射技术ppt

    Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和属性。通过反射,开发者能够获取关于类的信息,并且能够在运行时动态地创建对象和调用方法,这为编程带来...

    java反射技术Demo

    Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至能够动态调用方法和创建对象。这个技术的核心在于`java.lang.reflect`包中的类,如`Class`、`...

    Java反射技术浅谈.pdf

    Java反射技术浅谈 Java反射技术是一种强大的技术,它允许Java程序访问、检测和修改它自己的状态或行为。通过反射,Java程序可以加载一个运行时才知道名称的类,获取其完整的内部信息,并创建其对象,或者对其属性...

    java反射技术源码

    java反射技术应用的很广泛,多看源码,对理解java反射的理解会有很好的认识,这个源码有我自己的理解在里边

    java 反射技术

    ### Java反射技术详解 #### 引言 Java反射技术,作为Java编程语言中的一项核心特性,赋予了Java程序在运行时动态操作类的能力。通过反射,程序可以动态地获取类的信息,创建对象,访问和修改类的成员变量,以及...

    基础深化和提高-java反射技术

    Java反射技术指的是在运行时动态地获取类的信息、调用对象的方法、操作类的属性等能力。通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心...

    利用java反射技术实现动态搜索所有字段

    Java反射技术是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、对象等的内部信息,包括但不限于类名、方法名、参数类型以及字段。通过反射,开发者可以实现动态调用方法、访问私有成员、创建...

    Java反射技术浅谈 (1).pdf

    Java反射技术浅谈 Java反射技术是一种可以访问、检测和修改程序本身状态或行为的能力。通过反射,Java程序可以加载一个运行时才知道名称的类,得到其完整内部信息,并创建其对象,或对其属性设值,或调用其方法。...

    JAVA2 反射技术 pdf

    本文将详细介绍Java反射技术的核心概念及其应用。 #### 核心概念 1. **Class类**:Java反射的基础类是`Class`,每个类都对应一个`Class`实例。可以通过多种方式获取`Class`对象,例如使用类名直接获取(`MyClass....

    java 反射技术 设计模式 spring security 安全管理手册

    Java反射技术是Java编程语言中一个强大的特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。通过反射,我们可以动态地获取类的信息(如类名、属性、方法等)并进行调用,甚至在不知道具体...

    Java反射技术原理与用法实例分析

    Java反射技术原理与用法实例分析 Java反射技术是Java语言中的一种动态语言技术,能够在运行时解析外部对象的信息。通过反射技术,可以动态地获取类以及类中的成员,并可以调用该类成员。 产生反射技术的需求: 在...

    Java反射技术栈1

    总结,Java反射技术是其强大之处,它赋予了Java代码在运行时动态操作类和对象的能力。但使用时需谨慎,平衡灵活性和性能,避免过度使用导致代码难以管理和效率下降。在理解其原理和应用场景的基础上,适当使用反射...

    java反射技术与类使用示例.docx

    Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法。在Java中,反射主要用于在未知类名或动态加载类的情况下进行编程,提供了对类的元数据(metadata)的访问,使得...

    java反射技术分析类结构实验

    运行程序,指定一个要分析的类名称,如java.lang.Double,输出类中声明的属性、方法、构造函数等。

    Java反射技术的一般应用(放低分数供大家学习)

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    基于Java反射技术实现简单IOC容器

    基于Java反射技术实现简单IOC容器 Java反射技术是Java语言中一个非常重要的技术,通过反射技术可以在运行时检查和修改类的结构和行为。IOC容器是控制反转的缩写,全称是Inverse of Control,即控制反转。它是一种...

    Java反射技术综合应用(同时包括一些IO 和 图形化界面知识)

    利用Java反射、IO、图形化技术相结合实现的一个类搜索小工具,可以直观的看到效果,代码不多,注释齐全,适合初阶段学习。

    Java 反射封装 JavaBean

    使用 Java 反射封装 JavaBean <br> 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean

Global site tag (gtag.js) - Google Analytics