`

Java内省和反射机制三步曲之(2)反射

阅读更多

 经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java的反射和内省机制,希望对大家有点帮助,也希望大家提出不同的看法!

1).通俗的讲,反射就是把java类中的各种成分映射成相应的java类.如一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等信息也用一个个的java类表示。那么java类的Class类显然要提供一系列的方法来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应的类的实例对象来表示,它们是Field,Method,Construtor,Package等。

JAVA反射机制是在运行状态中, 对于任意一个类,都能够得到这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法; 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 

2).一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示。

3).Constructor类:Constructor类代表某个类中的一个构造方法.

.1)得到某个类所有的构造方法:例如: Constructor[] cons = String.class.getConstructors();

.2)得到某一个构造方法:例如: Constructor cons = String.class.getConstructor(StringBuffer.class);//获得构造方法时要调用的参数类型,因为要识别构造方法,必须靠参数类型。

.3)创建实例对象:
通常情况下:String str = new String(new StringBuffer("abc"));
反射方式: String str = (String) cons.newInstance(new StringBuffer("abc"));//调用获得方法时要用到上面相同类型的实例对象

.4)Class.newInstance()方法,它是把class - constructor - new obj 简化为 class - newInstance
原理:该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象,该方法内部用到了缓存机制来保持默认构造方法的实例对象,相当于调用 无参的构造方法,反射会导致系统性能下降.所以使用反射要慎重。
例如: String sr = String.class.newInstance();

相关代码:

 

public static void main(String[] args) throws Exception {   
    Constructor constructor = String.class.getConstructor(StringBuffer.class);   
    String str2 =(String)constructor.newInstance(new StringBuffer("abc"));   
    //newInstance()返回的是一个Object,所以要用类型转换   
    System.out.println(str2);   
       
    String str3 = (String)constructor.newInstance("abc");   
    System.out.println(str3);//有异常:argument type mismatch   
    //获得构造方法时要调用的参数类型和调用获得方法时要有相同的参数类型   
}   

 

4).Field类:Field类代表类中的一个成员变量
相关代码一:
 
public class Point {   
public Integer x;   
private Integer y;   
  
public Point(Integer x, Integer y) {   
    super();   
    this.x = x;   
    this.y = y;   
}   
}   
  
public static void main(String[] args) throws Exception {   
    Point reflect = new Point(2, 5);   
    Field fieldX = Point.class.getField("x");   
    // 此时fieldX的值不是5,fieldX不是对象身上的变量,而是类上,要用它去取对象身上的值,必须和实例对象结合使用。   
  
    Integer valueX = (Integer) fieldX.get(reflect);   
    System.out.println(valueX);// 2   
  
//    Field fieldY = Point.class.getField("y");   
//    // 由于属性y的修饰符是private,所以程序运行到此处就有异常,说该属性不存在:java.lang.NoSuchFieldException: y  
//    Integer valueY = (Integer) fieldY.get(reflect);   
  
//    // 下面的方法可以解决无法查看私有属性的方法   
//     Field fieldY2 = Point.class.getDeclaredField("y");   
//    //getDeclaredField():只要声明的变量都可以查看,运行到此处无异常   
//     Integer valueY2 = (Integer) fieldY2.get(reflect);   
//    // 在这里会有异常,属性虽然存在,但无法访问:Class com.sun.Reflect can not access a member of class com.sun.Point with modifiers "private"   
  
  
    // 暴力反射,即使设为private的属性变量依然可以访问,   
    Field fieldY3 = Point.class.getDeclaredField("y");   
    fieldY3.setAccessible(true);   
    Integer valueY3 = (Integer) fieldY3.get(reflect);   
    System.out.println(valueY3);// 5   
    //一个代表看不见,一个代表看见了但取出到值,就类如:(一)我看不到别人的钱,(二)是我看到了,但是用不到,暴力反射就相当于"qiangjie".   
}   
  
相关代码二:   
public class Point {   
public String str1 = "who";   
public String str2 = "when";   
public String str3 = "where";   
public Integer num = 5;   
public boolean istrue = true;   
  
public String toString() {   
    return str1 + "-" + str2 + "-" + str3 + "-" + num + "-" + istrue;   
}   
}   
  
public class Reflect {   
public static void main(String[] args) throws Exception {   
    Point point = new Point();   
    System.out.println(point);// who-when-where-5-true   
    changeFieldValues(point);   
    System.out.println(point);// Who-When-Where-5-true:把"w"改成了大写的"W"   
    //我们看到了反射可以任意改变属性的值,这种应用在很多框架中都有使用!   
}   
  
private static void changeFieldValues(Point point) throws IllegalAccessException {   
    Field[] fields = Point.class.getFields();   
    for (Field field : fields) {   
      if (field.getType() == String.class) {   
        String oldVal = (String) field.get(point);   
        String newVal = oldVal.replace("w", "W");   
        field.set(point, newVal);   
      }   
    }   
}   
}   
  
 

5).Method:Method类代表某个类中的一个方法;
.1)得到某个类中某一个方法:例如:Method stringCharAt = String.class.getMethod("charAt", int.class);
.2)创建实例对象:
通常方式: System.out.println("abcd".charAt(1));
反射方式: System.out.println(stringCharAt.invoke("abcd", 1));//b,如果invoke得第一个参数为空,那么该method对应的是一个静态方法
.3)invoke()在JDK1.4,和1.5中的参数形式不同。
相关代码:
 
public static void main(String[] args) throws Exception {   
    String str = "welcome!";   
    Method charAt = String.class.getMethod("charAt", int.class);   
    System.out.println(charAt.invoke(str, 0));// w   
}  
 
 
分享到:
评论

相关推荐

    java面试题--反射机制

    动态加载类是Java反射机制的重要应用场景之一。通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`new...

    JAVA的内省机制(introspector)与反射机制(reflection).docx

    JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们有什么区别和联系? 一、内省机制(introspector) 内省...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    java反射全解(反射原理+反射API详解+反射与数组+反射与泛型+反射源码与性能开销+反射优缺点+反射与内省)

    java 反射机制是 Java 语言中的一种动态获取信息和调用对象方法的技术核心。它允许在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。通过反射机制,可以在运行时判断任意一个对象所属的类、构造任意...

    java反射机制.pdf

    Java反射机制是Java语言的重要组成部分之一,它赋予了Java一定的动态特性。通过反射机制,开发者可以在运行时获取类的信息并进行各种操作,极大地提高了Java应用程序的灵活性和扩展性。了解并掌握Java反射机制对于...

    C++反射机制实现

    反射的定义源自人工智能领域,它主要涉及到两种反射结构:结构反射和计算反射。结构反射侧重于元类与类之间的关系,计算反射则关注于计算层面上的应用领域相关目标计算和系统自身的反射计算。在编程语言中,反射通常...

    java内省思维导图

    特别详细的java内省思维导图,全方面介绍java内省的功能以及用法用处。

    Java中的内省与反射.doc

    在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要。本文将详细介绍这两者的基本原理、应用场景...

    Java反射与内省-PPT

    Java反射与内省是Java编程语言中的核心特性,它们为开发者提供了强大的能力,可以在运行时检查和操作类、接口、对象及其属性。本PPT深入探讨了这些概念,旨在帮助开发者充分利用Java平台的灵活性。 首先,Java反射...

    类的反射机制您的网络连接,请

    Java中的反射机制是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。在Java 1.5引入的反射API使得开发者可以在编译期未知的情况下,动态地获取类的信息并执行相关操作。以下将详细介绍...

    用反射和内省技术实现简单SpringIOC

    本篇文章将深入探讨如何利用反射和内省技术来实现一个简单的Spring IOC。首先,我们来理解什么是反射和内省。 反射是Java提供的一种强大的动态类型机制,它允许程序在运行时检查类的信息,如类名、属性、方法等,并...

    JAVA反射侯捷观点

    Java反射机制是Java被视为动态语言的关键特性之一,它允许程序在运行时通过Reflection APIs获取任何已知名称的类的内部信息。这一机制使得开发者能够在运行时检查类的修饰符(如public、static等)、超类(如Object...

    Java 内省(Introspector)深入理解

    Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...

    Java Reflection in Action

    Java Reflection in Action这本书作为Java反射机制的经典之作,详细介绍了反射技术的应用和相关的概念基础,是Java开发者的必备书籍。 首先,反射允许开发者在不知道对象具体类型的情况下,通过类名获取类类型,...

    酷炫javaweb后台系统适合初学者【里面有封装 反射内省等】

    在这个"酷炫javaweb后台系统"中,包含了一些核心的JavaWeb技术和编程理念,如封装、反射和内省等。这些概念是Java编程的重要组成部分,对于理解和构建高效的应用程序至关重要。 首先,让我们来探讨一下"封装"。封装...

Global site tag (gtag.js) - Google Analytics