- 浏览: 143395 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (129)
- framework (18)
- Java (25)
- web2.0 (7)
- Oracle (23)
- 框架师 (20)
- design pattern (5)
- j2ee (6)
- 日常问题收集 (51)
- linux (12)
- Oralce优化 (4)
- life (3)
- sqlplus (1)
- sql (2)
- C# (4)
- mysql (9)
- 拿来主义 (12)
- 标签 (0)
- ThinkPHP (1)
- python (1)
- mybatis (2)
- html5 (1)
- jquery (2)
- hadoop (3)
- git (1)
- struts2 (1)
- shiro (1)
- struts (1)
最新评论
-
xiao88xian:
...
jQuery常用经典技巧
以前一直只知道有reflect这么一个类是用来反射的,听人家说java中的反射很难,晚上听罢张老师讲的反射这一节的内容,惶然大悟,原来反射就是把Java类中的各种成分映射成相应的java类。
反射的基础是要掌握Class这个类的,具体Class的类是干什么的,下面是api文档中的解释
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 类型(boolean
、byte
、char
、short
、int
、long
、float
和 double
)和关键字 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");
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();
得到某一个构造方法:
例子:
下面是一个Field反射的综合实例
下面的步骤是:先从对象中得到所有为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 />-->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"));//调用获得的方法时要用到上面相同类型的实例对象
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
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
结果如下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
p1 中 y = -1
p1 中 x = 1
a=bbll;b=bbsketbbll;c=hello
综上可以看出,其实反射也没多难,人家那些写框架的也不就是用了些反射吗?把配置文件中的东西读出来,然后再调用下面的类去做应该做的事情,当然这个过程就用到了反射了。
发表评论
-
使用OSCache实现页面的缓存,优化性能
2013-07-10 14:21 1048使用OSCache实现页面的缓存,优化性能 OSC ... -
BigDecimal不整除的一个异常java.lang.ArithmeticException: Non-terminating decimal expansi
2013-03-26 10:34 1585金额的数据类型是BigDec ... -
解决subclipse报错:svn: Can't open file 'D:\project\Xxx.java.svn-base': 系统找不到指定的文件
2013-03-23 16:49 1953环境为:XP, eclipse, subclipse。 我想 ... -
hibernate4+spring3.1整合常见问题解决方法
2013-03-21 19:21 807由于目前网上很少有关于hibernate4+spring3. ... -
JAVA String.format 方法使用介绍(生成序列号的时候很有用哦)
2013-03-21 10:39 1279JAVA String.format 方法使 ... -
Ant-Ivy使用
2013-02-21 12:27 1068转至:http://blog.csdn.net/leon70 ... -
Java时间处理
2013-01-17 17:33 7961.获得当前系统时间 首先System ... -
no jacob in java.library.path错误的解决
2013-01-15 11:25 958一般把jacob.dll(不同版本的jacob的dll文件名 ... -
java合并几个图片
2013-01-08 15:39 872package com.anduo.web; im ... -
JDK 1.6 API 中英文版 在线版、下载地址
2013-01-05 10:38 1367JDK 1.6 API(全) * HTML 格式(在线英 ... -
JAVA String.format方法使用介绍
2013-01-04 12:28 826转至:http://soft.chinab ... -
java中byte数组与int,long,short间的转换
2012-12-26 14:07 942开发问题收集 package com.util; ... -
通过知道的class文件得到该文件所在的jar包
2012-09-18 14:23 748String path = XXX.class.getP ... -
利用java内置库的HashMap统计字符串中单词出现的个数问题
2011-05-14 20:16 683没什么好说的,我就直接把代码放上面吧: package co ... -
classpath、path、JAVA_HOME的作用
2011-11-05 14:13 948CLASSPATH是什么? ... -
JAVA基础巩固加强 enhance day1
2011-11-07 18:52 920最近忙着找工作,可是总是到最后面试完了就没信儿了。哎,你说找个 ... -
如何用jdbc连接数据库 java连接数据库的五步
2011-06-09 22:18 1458用JDBC连接数据库 本文用sqlserver2000 ... -
Java 完全面向对象的贪吃蛇游戏
2011-05-09 10:08 1043JavaSE的项目:贪吃蛇( ... -
利用java内置库的HashMap统计字符串中单词出现的个数问题
2011-05-14 20:16 2533没什么好说的,我就直接把代码放上面吧: package c ... -
开发自己的jar包 pinyin4j
2011-05-14 19:52 1482今天开发了自己的第二个开源工具 jar包 名称:pinyin4 ...
相关推荐
在Java世界里,"Enhance"通常指的是优化和增强,这可能包括性能优化、代码重构、新特性的利用等方面。以下是根据标题和描述可能涉及的一些Java高级技术知识点: 1. **Java集合框架**:包括HashMap、ArrayList、...
软件描述:通过对数以千计的视频进行训练,并结合来自多个输入视频帧的信息, Topaz Video Enhance AI将以真实的细节和运动一致性将您的素材放大和增强到8K分辨率。使用智能AI技术,Video Enhance AI是有史以来功能...
本文将深入探讨`enhance-require`如何增强`require`,以及它在前端开发中的应用和重要性。 首先,`require`函数在Node.js环境中用于导入和使用其他模块,使得代码可以模块化,易于管理和复用。然而,原生的`require...
在合成新波段时,采用了分段增强,使得植被增强效果更加自然。 操作步骤 1) 启动ENVI,打开遥感图像文件; 2) 按照下面指定的工具或菜单路径找到Image Derivative工具,并启动。 在ENVI 5.2中,在Toolbox中选择/...
Digital Enhance照片处理
- 图像增强:`enhance()`函数执行图像增强操作,如对比度调整、直方图均衡化等,以提高目标的可见性。 2. **目标检测**: - 分块:`cutIntoBlocks()`函数将图像分割成多个相等大小的小块,便于独立处理。 - 特征...
"Enhance工具类"在IT领域中通常指的是一个专门设计用于增强或扩展程序功能的类库。这样的工具类集合了一组静态方法,可以方便开发者在项目中进行各种常见操作,提高开发效率。以下是对"Enhance工具类"的详细解释和...
总的来说,这个“image_enhance”项目涵盖了数字图像处理的基础操作,通过MATLAB编程实现了一系列图像增强技术。这些技术在医学成像、卫星遥感、视频监控等领域都有广泛应用。了解并掌握这些技术对于深入理解和实践...
`config_enhance` 是一个Python库,专为增强配置管理而设计。在Python开发中,尤其是在后端服务中,配置管理是至关重要的,它允许开发者以结构化的方式存储和处理应用程序的设置,如数据库连接、API密钥、服务器端口...
大神devernay的 glm enhance版 opengl 下读取 obj 文件 含例子
《IE Tab Multi (Enhance):为Chrome带来的IE兼容性解决方案》 在互联网浏览器的世界里,Chrome以其稳定性和丰富的扩展库赢得了广大用户的喜爱。然而,有些网页或在线应用仍然依赖于Internet Explorer(IE)特有的...
1. **性能优势**:相比于使用Java反射机制,CGLib生成的代理对象在性能上更优,因为它避免了反射带来的开销。 2. **无需接口**:CGLib可以对没有实现接口的类进行代理,这是Java动态代理(JDK Proxy)无法做到的。 3...
空域增强、频域增强、图像锐化 支持阈值滤波、均值滤波、中值滤波 Kirsch算子、Laplace算子、Prewitt算子、Roberts算子、Sobel算子、 Butterworth高通滤波、Butterworth低通滤波、模板滤波等算法
### 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 ...
在Java编程中,代理模式是一种设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或行为。代理模式通常用于控制访问、增加额外的处理逻辑或提供一种替代的接口。Java提供了两种主要的代理实现方式:...
"matlab1.zip_WACT_enhance image_meatm4z_threadqso_细节增强"这个标题表明我们关注的是一个使用MATLAB实现的、针对图像细节增强的程序包,可能包含了一些特定的算法,如WACT(可能是作者自定义的工作流或算法)、...
标题中的"data_enhance.zip_数据增强"表明这是一个关于数据增强的压缩包文件,可能包含了实现数据增强的各种方法、代码或者示例。 在图像处理中,数据增强通常用于模拟真实世界中的变化,例如光照条件、角度、尺度...
视频超分处理工具,包含waifu2x、realesr、realcugan超分算法
在图像处理领域,"enhance_mam.rar_image_image enhance_processing" 这个压缩包文件包含了一个名为 "enhance_mam.m" 的MATLAB脚本,主要用于图像增强处理。MATLAB是一种广泛应用于数值计算、符号计算、数据可视化...