`
啸笑天
  • 浏览: 3466027 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

18 理解反射的概念19构造方法的反射应用20成员变量的反射 21成员变量反射的综合案例22成员方法的反射

阅读更多

 

18 理解反射的概念

反射

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

二、一个类中的每个成员都是可以用相应的反射API类中的一个实例对象来表示,痛过调用Class类的方法可以得到这些实例对象。

 

19构造方法的反射应用

Constructor类代表某个类中的一个构造方法

<!--[if !supportLists]-->1、<!--[endif]-->得到某个类所有的构造方法:

例子: 

Constructor[]cnstructor=Class.forName(“java.lang.String”).getConstructors();

2、得到某一个构造方法:

例子:

Constructor cnstructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

//获得方法时要用到类型。例如

int.class(int []).class

int [] ints = new int[0];

ints.getClass();

<!--[if !supportLists]-->3、<!--[endif]-->创建实例对象

通常方法:String str=new String(new StringBuffer("zyj"));

反射方法:String str=(String) constructor1.newInstance(new StringBuffer("zyj"));//通常获得的方法时要用到上面相同类型的实例对象

<!--[if !supportLists]-->4、<!--[endif]-->Class.newInstance()方法

例子:

String str =Class.forName(“java.lang.String”). newInstance();

*该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

*该方法内部的具体代码时用到了缓存机制来保存默认构造方法的实例对象。所以反射比较消耗资源,利用了缓存,会导致系统性能严重下降。(看Class类中newInstance()方法

 

示例代码:

 

//new String(new StringBuffer("zyj"));与下面的功能相同
Constructor<String>constructor=String.class.getConstructor(StringBuffer.class);
String str2=constructor.newInstance(new StringBuffer("zyj "));
System.out.println(str2.charAt(2));

  

 

20成员变量的反射  21成员变量反射的综合案例

Field类代表某个类中的一个成员变量

示例代码:

package cn.zyj2021.review;
public class ReflectPoint {
   private int x;
   public  int y;
   public String str1="ball";
   public String str2="basketball";
   public String str3="zyj";
  
   public ReflectPoint(int x, int y) {
      super();
      this.x = x;
      this.y = y;
   }
 
   @Override
   public String toString() {
      return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3="
            + str3 + "]";
   }
}
 
package cn.zyj2021.review;
import java.lang.reflect.Field;
public class ReflectTest {
   public static void main(String[] args) throws Exception {
   ReflectPoint reflectPoint=new ReflectPoint(3, 6);
  
   Field fieldx=reflectPoint.getClass().getDeclaredField("x");//可以访问不可见的属性
   fieldx.setAccessible(true);
   System.out.println(fieldx.get(reflectPoint));
   //fieldy的值是多少?是6,错!fieldY不是对象身上的变量,而是类上,代表某个字节码上的变量,要用它去取某个对象上对应的值
   Field fieldy=reflectPoint.getClass().getField("y");//只能访问可见的属性
   System.out.println(fieldy.get(reflectPoint));
  
   changeStringValue(reflectPoint);
   System.out.println(reflectPoint);
   }
  
   //将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"。
   private static void changeStringValue(Object object) throws Exception {
      Field[] fields=object.getClass().getDeclaredFields();
      for (Field field : fields) {
         if (field.getType()==String.class) {//不用equals(),因为他们是只有一份字节码
            field.setAccessible(true);
            String temp=(String) field.get(object);
            field.set(object, temp.replace('b', 'a'));
         }
      }
   }
   /*
    一个问题,我把自己的变量定义成private,就是不想让人家访问,可是,现在人家用暴力反射还是能够访问我,这说不通啊,能不能让人家用暴力反射也访问不了我。
    首先,private主要是给javac编译器看的,希望在写程序的时候,在源代码中不要访问我,是帮组程序员实现高内聚、低耦合的一种策略。你这个程序员不领情,非要去访问,那我拦不住你,由你去吧。
    同样的道理,泛型集合在编译时可以帮助我们限定元素的内容,这是人家提供的好处,而你非不想要这个好处,怎么办?绕过编译器,就可以往集合中存入另外类型了。
    */
}

 

 

 

22成员方法的反射

<!--[if !supportLists]-->1、  <!--[endif]-->Method 代表某个类中的一个成员方法

<!--[if !supportLists]-->2、  <!--[endif]-->得到类中的一个方法:

例子:

Method method=String.class.getMethod("charAt",int.class);

<!--[if !supportLists]-->3、<!--[endif]-->调用方法:

通常方式:str1.charAt(1);

反射方式:method.invoke(str1, 1);

如果传递给Method对象的invoke()方法的第一个参数为null,这说明该Method对象对应的是一个静态方法。

<!--[if !supportLists]-->4、<!--[endif]-->jdk1.4jdk1.5invoke方法的区别:

jdk1.5public Object invoke(Object obj,Object… args)//args参数用Class对象表示

jdk1.4public Object invoke(Object obj,Object[] args)

 

//反射不能读这种非public

 

分享到:
评论

相关推荐

    java基础案例与开发详解案例源码全

    5.4.1 对象封装的概念理解124 5.4.2 类的理解125 5.4.3 Java类模板创建125 5.4.4 Java中对象的创建和使用127 5.5 属性130 5.5.1 属性的定义130 5.5.2 变量131 5.6 方法132 5.6.1 方法的定义132 5.6.2 构造方法135 ...

    java加强笔记

    成员变量反射的综合案例 - 综合案例可能涉及利用反射来动态地创建对象并设置其私有成员变量。 ##### 6. 成员方法的反射 - 可以使用`Class`对象的`getDeclaredMethods()`方法获取类的所有成员方法,使用`invoke`...

    C#25个案例培训教学

    15. **反射**:C#的反射能力允许在运行时检查和操作程序集、类型、成员等,案例可能涉及如何利用反射实现动态类型操作。 16. **委托和事件**:C#的委托和事件机制是实现回调和响应机制的关键,案例会教你如何使用...

    21天学通JAVA.PPT

    19. **反射机制**:学习运行时动态加载类,获取类信息,以及调用方法和访问属性。 20. **集合框架的高级特性和Lambda表达式**:涵盖Stream API,Optional类,以及Java 8引入的Lambda表达式。 最后,通过实际项目或...

    javaSE代码实例

    6.6.1 调用不存在的方法或成员变量 87 6.6.2 用空引用进行调用 88 6.6.3 数组的空引用问题 89 6.7 局部变量 89 6.7.1 局部变量的作用域 89 6.7.2 局部变量的初始化 90 6.8 this预定义对象引用 92 6.9...

    21天学通Java-由浅入深

    第一篇 基础篇 第1章 Java简介(精彩视频:33分钟) 21 1.1 Java的平台简介 21 1.2 安装工具包 22 1.2.1 下载JDK 22 1.2.2 安装JDK 24 1.2.3 查看与设置环境变量 25 1.2.4 JDK常用命令 27 1.2.5 Java各个目录含义 28...

    C#100个实例程序

    在C#编程语言的学习过程中,实例程序是理解概念和掌握技术的关键。"C#100个实例程序"集合提供了一套丰富的实践案例,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这100个实例可能涵盖的一些核心知识...

    Java语言学习笔记

    20. **反射**:在运行时动态获取类信息,创建对象,调用方法的能力。 21. **Java API与标准库**:介绍Java标准库中的常用类和接口,如日期时间API、网络编程API等。 这个Java JDK 6学习笔记的PPT可能会深入每个...

    java基础总结大全

    19. **泛型**:泛型类、泛型方法、通配符和类型擦除的概念。 20. **Lambda表达式**:Java 8引入的新特性,简化函数式编程,理解函数式接口和方法引用来使用Lambda。 以上知识点构成了Java基础的主体,通过深入理解...

    java笔试题集锦

    2. **数据类型与变量**:理解基本数据类型(如int、float、char)与引用数据类型(如类、接口、数组)的区别,以及声明、初始化和使用变量的方法。 3. **运算符与流程控制**:掌握算术、比较、逻辑、位运算符,以及...

    很实用的30个c#小程序实例

    13. **反射**:通过反射机制动态访问和操作程序集、类型、成员等,提升程序灵活性。 14. **单元测试**:通过实例学习如何使用 MSTest 或 NUnit 进行单元测试,确保代码质量。 15. **Windows Forms 和 WPF**:如果...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    JAVA实用编程100例

    8. **反射API**:利用反射动态调用方法、获取类信息、创建对象,理解其在程序设计中的应用。 9. **网络编程**:Socket编程,TCP和UDP通信,以及HTTP协议的简单实现。 10. **文件与目录操作**:文件的读写、复制、...

    Java软件开发实战 Java基础与案例开发详解 15-4 练习题 共5页.pdf

    - **题目3**:编写一个程序,该程序能够指定调用类的构造方法,并将操作信息输出到控制台。 - 示例代码: ```java public class ReflectionDemo { public static void main(String[] args) { try { Class&lt;?&gt; ...

    Java软件开发实战 Java基础与案例开发详解 14-8 练习题 共6页.pdf

    内部类是一种定义在另一个类内部的类,它可以访问外部类的成员变量和方法。 #### 8.2 对象包装器 对象包装器是将基本数据类型包装为对象类型的类,如Integer、Double等。 #### 8.3 装箱和拆箱 装箱是将基本类型...

    Effective_C#_中文版_改善C#程序的50种方法

    《Effective C#》一书由Bill Wagner撰写,旨在帮助C#程序员提高编程技能,通过50种具体的方法改进C#程序的质量。以下是书中部分章节及其关键知识点的详细解析: ### 第一章:C#语言元素 #### 原则1:始终能的使用...

    cursoJava:库索德Java教授内里奥·阿尔维斯(NélioAlves)

    20. **Java应用部署**:学习如何打包应用为JAR或WAR文件,以及使用Tomcat等应用服务器部署Web应用。 这个课程"cursoJava:库索德Java教授内里奥·阿尔维斯(NélioAlves)"将涵盖以上所有知识点,通过深入浅出的讲解...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、操作、应用或认证考试上的各种问题及解决方案。  《Java JDK 7学习笔记》详细介绍了JVM、JRE、Java SE API、JDK与IDE...

Global site tag (gtag.js) - Google Analytics