`

JAVA基础巩固加强 enhance day1反射 reflect

    博客分类:
  • Java
 
阅读更多

以前一直只知道有reflect这么一个类是用来反射的,听人家说java中的反射很难,晚上听罢张老师讲的反射这一节的内容,惶然大悟,原来反射就是把Java类中的各种成分映射成相应的java类。    
    反射的基础是要掌握Class这个类的,具体Class的类是干什么的,下面是api文档中的解释

    api中关于Class类的一段描述
Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class that is reflected as a Class object that is shared by all arrays with the same element type and number of dimensions. The primitive Java types (boolean, byte, char, short, int, long, float, and double), and the keyword void are also represented as Class objects.
翻译成中文
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(booleanbytecharshortintlongfloatdouble)和关键字 void 也表示为 Class 对象。

    可以看出Class类就是一个类或者接口对象的一个实例在内存中的字节码,而如何得到一个类的字节码呢?其方法有三:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->1         Class<? extends String> cls1 = str1.getClass();
2         Class<String> cls2 = String.class;
3         Class<?> cls3 = Class.forName("java.lang.String");

    而Class的isPrimitive()方法就是用来判断一个类的字节码是不是9个预定义的class
    
    接下来是Constructor类,Constructor类代表某个类中的一个构造方法。
   得到某个类所有的构造方法: 例子

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
  
    得到某一个构造方法:
   例子:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);//获得方法时要用到类型
 
    创建实例对象:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->//通常方式:
String str = new String(new StringBuffer("abc"));
    
//反射方式: 
String str = (String)constructor.newInstance(new StringBuffer("abc"));//调用获得的方法时要用到上面相同类型的实例对象
   
    Class.newInstance()方法:
   例子:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->String obj = (String)Class.forName("java.lang.String").newInstance();
    该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
   该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。
   

下面是一个Field反射的综合实例
将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"。 
首先定义一个ReflectPoint的类
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 package com.anduo.day1;
 2 
 3 public class ReflectPoint {
 4     private int x;
 5     public int y;
 6     public String a = "ball";
 7     public String b = "basketball";
 8     public String c = "hello";
 9 
10     public ReflectPoint(int x, int y) {
11         super();
12         this.x = x;
13         this.y = y;
14     }
15 
16     @Override
17     public String toString() {
18         return "a=" + a + ";b=" + b + ";c=" + c;
19     }
20 }
21 

下面的步骤是:先从对象中得到所有为String类型的字段,2:得到Sting字段的值;3:用String类的replace方法代换a字符为b字符;4:把对象的String字段设置为修改完的新String。
齐活儿
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 package com.anduo.day1;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 
 6 public class ReflectTest {
 7 
 8     
 9     public static void main(String[] args) throws Exception {
10 
11         
12         /**
13          * 成员变量的反射 Field
14          */
15         System.out.println("**成员变量的反射 Field**");
16         ReflectPoint pt1 = new ReflectPoint(1-1);
17         Field fieldY = pt1.getClass().getField("y");
18         // fieldY 不是对象身上的变量,而是类上,要用它来去对象上字段的值
19         System.out.println("p1 中  y = " + fieldY.get(pt1));
20         Field fieldX = pt1.getClass().getDeclaredField("x");// 获取私有属性字段
21         fieldX.setAccessible(true);// 暴力反射
22         System.out.println("p1 中  x = " + fieldX.get(pt1));
23 
24         /**
25          * 将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"
26          */
27         changeStringValue(pt1);
28         System.out.println(pt1);
29     }
30 
31     /**
32      * 将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"
33      * @param obj
34      * @throws IllegalArgumentException
35      * @throws IllegalAccessException
36      */
37     private static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
38         Field[] fields = obj.getClass().getFields();
39         for (Field field : fields) {
40             // if(field.getType().equals(String.class))
41             if (field.getType() == String.class) {
42                 String oldValue = (String) field.get(obj);
43                 String newValue = oldValue.replace('a''b');
44                 field.set(obj, newValue);
45             }
46         }
47     }
48 
49 }
50 
结果如下
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->**成员变量的反射 Field**
p1 中  y 
= -1
p1 中  x 
= 1
a
=bbll;b=bbsketbbll;c=hello

综上可以看出,其实反射也没多难,人家那些写框架的也不就是用了些反射吗?把配置文件中的东西读出来,然后再调用下面的类去做应该做的事情,当然这个过程就用到了反射了。

分享到:
评论

相关推荐

    JavaEnhance

    在Java世界里,"Enhance"通常指的是优化和增强,这可能包括性能优化、代码重构、新特性的利用等方面。以下是根据标题和描述可能涉及的一些Java高级技术知识点: 1. **Java集合框架**:包括HashMap、ArrayList、...

    Topaz Video Enhance AI

    软件描述:通过对数以千计的视频进行训练,并结合来自多个输入视频帧的信息, Topaz Video Enhance AI将以真实的细节和运动一致性将您的素材放大和增强到8K分辨率。使用智能AI技术,Video Enhance AI是有史以来功能...

    前端开源库-enhance-require

    本文将深入探讨`enhance-require`如何增强`require`,以及它在前端开发中的应用和重要性。 首先,`require`函数在Node.js环境中用于导入和使用其他模块,使得代码可以模块化,易于管理和复用。然而,原生的`require...

    ENVI 扩展工具-植被增强

    在合成新波段时,采用了分段增强,使得植被增强效果更加自然。 操作步骤 1) 启动ENVI,打开遥感图像文件; 2) 按照下面指定的工具或菜单路径找到Image Derivative工具,并启动。 在ENVI 5.2中,在Toolbox中选择/...

    Digital Enhance照片处理

    Digital Enhance照片处理

    用·java实现yolo算法,训练自己的数据 由浅入深代码集.docx

    - 图像增强:`enhance()`函数执行图像增强操作,如对比度调整、直方图均衡化等,以提高目标的可见性。 2. **目标检测**: - 分块:`cutIntoBlocks()`函数将图像分割成多个相等大小的小块,便于独立处理。 - 特征...

    Enhance工具类

    "Enhance工具类"在IT领域中通常指的是一个专门设计用于增强或扩展程序功能的类库。这样的工具类集合了一组静态方法,可以方便开发者在项目中进行各种常见操作,提高开发效率。以下是对"Enhance工具类"的详细解释和...

    Digital Camera Enhance 模糊照片变清晰

    1. **图像锐化**:这是最基础的增强方法,通过增加边缘对比度来提高图像的清晰度。软件可能运用了多种锐化技术,如高斯锐化、Unsharp Mask (USM) 或基于像素的局部对比度增强。 2. **降噪**:高ISO设置或者光线不足...

    image_enhance

    总的来说,这个“image_enhance”项目涵盖了数字图像处理的基础操作,通过MATLAB编程实现了一系列图像增强技术。这些技术在医学成像、卫星遥感、视频监控等领域都有广泛应用。了解并掌握这些技术对于深入理解和实践...

    Python库 | config_enhance-1.2.2-py2.7.egg

    `config_enhance` 是一个Python库,专为增强配置管理而设计。在Python开发中,尤其是在后端服务中,配置管理是至关重要的,它允许开发者以结构化的方式存储和处理应用程序的设置,如数据库连接、API密钥、服务器端口...

    glm enhance版

    大神devernay的 glm enhance版 opengl 下读取 obj 文件 含例子

    IE Tab Multi (Enhance)_12.2.12.1-0.zip

    《IE Tab Multi (Enhance):为Chrome带来的IE兼容性解决方案》 在互联网浏览器的世界里,Chrome以其稳定性和丰富的扩展库赢得了广大用户的喜爱。然而,有些网页或在线应用仍然依赖于Internet Explorer(IE)特有的...

    cglib动态生成java类

    1. **性能优势**:相比于使用Java反射机制,CGLib生成的代理对象在性能上更优,因为它避免了反射带来的开销。 2. **无需接口**:CGLib可以对没有实现接口的类进行代理,这是Java动态代理(JDK Proxy)无法做到的。 3...

    C# Image Enhance 图像增强

    空域增强、频域增强、图像锐化 支持阈值滤波、均值滤波、中值滤波 Kirsch算子、Laplace算子、Prewitt算子、Roberts算子、Sobel算子、 Butterworth高通滤波、Butterworth低通滤波、模板滤波等算法

    1Z0-811 Exam Guide to Have a Cakewalk in Oracle Java SE Certific

    ### 1Z0-811 Exam Guide:Oracle Java SE Certification Key Knowledge Points #### Introduction to Oracle Java SE Certification 1Z0-811 Examination The 1Z0-811 examination is part of the Oracle Java SE ...

    Squirrel Anime Enhance 0.0.3(SAE)

    视频超分处理工具,包含waifu2x、realesr、realcugan超分算法

    Java代理实战Demo

    在Java编程中,代理模式是一种设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或行为。代理模式通常用于控制访问、增加额外的处理逻辑或提供一种替代的接口。Java提供了两种主要的代理实现方式:...

    matlab1.zip_WACT_enhance image_meatm4z_threadqso_细节增强

    "matlab1.zip_WACT_enhance image_meatm4z_threadqso_细节增强"这个标题表明我们关注的是一个使用MATLAB实现的、针对图像细节增强的程序包,可能包含了一些特定的算法,如WACT(可能是作者自定义的工作流或算法)、...

    data_enhance.zip_数据增强

    标题中的"data_enhance.zip_数据增强"表明这是一个关于数据增强的压缩包文件,可能包含了实现数据增强的各种方法、代码或者示例。 在图像处理中,数据增强通常用于模拟真实世界中的变化,例如光照条件、角度、尺度...

Global site tag (gtag.js) - Google Analytics