- 浏览: 990184 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (223)
- JDBC技术 (29)
- Java Base (21)
- SSH框架的集合 (5)
- Javascript部分 (16)
- Sping2.5框架 (6)
- Hibernate框架 (19)
- JDBC中的数据库连接 (5)
- Ajax技术应用 (9)
- Java工具包下载 (3)
- Database (4)
- Java Web (13)
- 我的生活 (4)
- Struts2 (25)
- S2SH (1)
- Prototype (1)
- jfreeChart (5)
- JPA (7)
- JBPM (1)
- JasperReport (6)
- DWR (1)
- freeMark (2)
- IBatis (2)
- FCKeditor (2)
- POI (1)
- JQuery (6)
- JSON (1)
- JavaMail (3)
- Flex (2)
- CSS收藏夹 (1)
- 润乾报表 (2)
- 开源技术 (1)
- Android (2)
- Android_UI (1)
- Android_OS (6)
- Android_OpenLibs (3)
- Volley (1)
- JS_OpenLibs (1)
- Hessian (3)
- OS (1)
最新评论
-
damoluomu:
简单易懂
Java Web开发Session超时设置 -
di1984HIT:
学习了~~~~~~
Java Web开发Session超时设置 -
lord_is_layuping:
...
Java Web开发Session超时设置 -
15111285554:
...
Java Web开发Session超时设置 -
sfg1314:
暂停后重新下载就会报错:ClientAbortExceptio ...
Java Web 文件下载之断点续传
/** * 反射(构造方法,成员变量,普通方法,数组) * * @author 张明学 * */ public class ReflectStudy { @SuppressWarnings("unused") public static void main(String[] args) throws Exception {
System.out.println("--------1. 构造方法反射-------"); Class strClass = String.class; Constructor[] constr = strClass.getConstructors(); // String的所有构造方法 for (Constructor constructor : constr) { System.out.println("构造方法参数个数:" + constructor.getParameterTypes().length); for (Class c : constructor.getParameterTypes()) { System.out.print(c.getName() + "\t"); } System.out.println(); } // 获取构造方法 Constructor constructor = String.class.getConstructor(StringBuffer.class); String str1 = (String) constructor.newInstance(new StringBuffer("abc")); System.out.println(str1.charAt(1)); // Class对象的newInstance()方法是对无参的构造方法的调用 String s1 = String.class.newInstance(); String s2 = new String(); System.out.println(s1.toString()); System.out.println(s2.toString());
输出结果:
--------1. 构造方法反射------- 构造方法参数个数:3 [C int int 构造方法参数个数:3 [I int int 构造方法参数个数:4 [B int int int 构造方法参数个数:2 [B int 构造方法参数个数:1 [C 构造方法参数个数:1 java.lang.String 构造方法参数个数:2 [B java.lang.String 构造方法参数个数:3 [B int int 构造方法参数个数:1 [B 构造方法参数个数:1 java.lang.StringBuffer 构造方法参数个数:1 java.lang.StringBuilder 构造方法参数个数:4 [B int int java.lang.String 构造方法参数个数:0 b
System.out.println("--------2. 成员变量反射-------"); // 获得成员变量(注:成员变量属于Class所有不属于某个对象) // public类型的可以直接获取 Field filedX = Point.class.getField("x"); // private类型的要通用getDeclaredField()方法获取 Field filedY = Point.class.getDeclaredField("y"); Point p = new Point(3, 7); // 获取成员变量的值(必须属于某个对象) System.out.println(filedX.get(p));// public类型可以直接获取 // private类型要设置setAccessible(true)才能获取变量值 filedY.setAccessible(true); System.out.println(filedY.get(p)); System.out.println(p); changeStringValue(p); System.out.println(p);
--------2. 成员变量反射------- 3 7 Point对象的值:str1 = abc str2 = abcabc str3 = ac Point对象的值:str1 = Bbc str2 = BbcBbc str3 = Bc
System.out.println("--------3. 方法反射-------"); // Method也是属于Class所有 Method charAtMethod = String.class.getMethod("charAt", int.class); // Method的调用必须属于某个对象:invoke(对象,参数...) // invoke(null, 参数...)表示调用的静态方法 String s = new String("abc"); System.out.println(charAtMethod.invoke(s, 2)); // 静态调用 TestArguments.main(new String[] { "111", "222", "333" }); // 类名由main(String[] args)方法中的第一个参数指定 if (args.length > 0) { String startingClassName = args[0]; Method startdMainMethod = Class.forName(startingClassName) .getMethod("main", String[].class); // main为静态方法 startdMainMethod.invoke(null, (Object) new String[] { "aaa", "bbb", "ccc" }); // 或 startdMainMethod.invoke(null, new Object[] { new String[] { "aaa", "bbb", "ccc" } }); }
--------3. 方法反射------- c 111 222 333 aaa bbb ccc aaa bbb ccc
System.out.println("--------4. 数组反射-------"); int[] a1 = new int[3]; int[] a2 = new int[6]; int[][] a3 = new int[3][3]; String[] a4 = new String[3]; // ******数组的反射:维数和类型相同的数组的Class是相同的****** \\ System.out.println(a1.getClass() == a2.getClass());// true System.out.println(a1.getClass() == a3.getClass());// true System.out.println(a1.getClass() == a4.getClass());// true // 数组可以转换成Object Object o1 = a1; Object o2 = a3; Object o3 = a4; // 基本数据类型的数组不能转换成Object[],复杂数据类型的数组可以转换成Object[] // Object[] o4 = a1; Object[] o5 = a3; Object[] o6 = a4; // Arrays工具类 a1 = new int[] { 1, 2, 3 }; a4 = new String[] { "a", "b", "c" }; System.out.println(Arrays.asList(a1));// 显示:[[I@9cab16] System.out.println(Arrays.asList(a4));// 显示:[a, b, c] printObject(a4); printObject("abc"); }
--------4. 数组反射------- true false false [[I@9cab16] [a, b, c] a b c abc
private static void printObject(Object obj) { Class clazz = obj.getClass(); if (clazz.isArray()) { int len = Array.getLength(obj); for (int i = 0; i < len; i++) { System.out.println(Array.get(obj, i)); } } else { System.out.println(obj); } } /** * 修改一个对象里的为String类型成员变量的属性值(将a换成B) * * @param p * @throws * @throws Exception */ private static void changeStringValue(Point p) throws Exception { Field[] fileds = p.getClass().getDeclaredFields(); for (Field field : fileds) { // 任何类型的Class只有一份 if (field.getType() == String.class) { String filedValue = (String) field.get(p); String newValue = filedValue.replace("a", "B"); field.set(p, newValue); } } } } class TestArguments { public static void main(String[] args) { for (String arg : args) { System.out.println(arg); } } }
所用的Point类如下:
public class Point { public int x; private int y; public String str1 = "abc"; public String str2 = "abcabc"; public String str3 = "ac"; public Point(int x, int y) { this.x = x; this.y = y; } @Override public String toString() { return "Point对象的值:str1 = " + str1 + " str2 = " + str2 + " str3 = " + str3; } }
评论
1 楼
mopishv0
2011-01-27
System.out.println(a1.getClass() == a2.getClass());// true System.out.println(a1.getClass() == a3.getClass());// true System.out.println(a1.getClass() == a4.getClass());// true
JDK1.6下编译不过
改成这样
Class a1C = a1.getClass(); Class a2C = a2.getClass(); Class a3C = a3.getClass(); Class a4C = a4.getClass(); // *****比较结果****** \\ System.out.println(a1C == a2C);// true System.out.println(a1C == a3C);// false System.out.println(a1C == a4C);// false System.out.println(a3C == a4C);// false
发表评论
-
HttpURLConnection附件上传
2015-05-15 18:25 3411整合了一个自己写的采用Http做附件上传的工具,分享一下! ... -
java自带线程池和队列详细讲解
2014-11-29 16:39 8511Java线程池使用说明 一简介 线程的使用在java中占 ... -
使用CGLIB的代理技术
2010-06-09 19:04 1537import java.lang.reflect.Method ... -
使用反射和注解模拟Spring的依赖注入
2010-06-09 19:00 4504作为一个应用Java的反射和注解的一个使用。 首简写一个XM ... -
Java基础十:JDK 动态代理类分析(java.lang.reflect.Proxy使用)
2010-05-28 19:25 4136/** * JDK 动态代理类分析(java.lang.r ... -
Java基础九:Java中的类加载器说明,可以对class文件加密,自定义ClassLoader
2010-05-28 19:22 3705/** * Java 类加载器 * * @aut ... -
Java基础八:泛型,?通配符
2010-05-28 19:17 6281/** * JDK1.5 泛型 * * @aut ... -
Java基础七:注解Annotation使用说明
2010-05-28 19:14 4016import java.lang.annotation.Ele ... -
Java基础六:apache的Beanutils简单使用对JavaBean操作的封装
2010-05-28 19:08 2180/** * apache的Beanutils简单使用 ... -
Java基础五:内省(对JavaBean的操作)
2010-05-28 19:05 2366/** * Person JavaBean * ... -
Java基础三: 枚举高级应用(向枚举值对象中添加变量和方法)
2010-05-28 18:45 3851/** * JDK1.5 枚举高级应用(向枚举值对象中添加 ... -
Java基础二: hashCode的作用简要说明,可能导致对象在集合中无法删除
2010-05-28 18:30 1635import java.util.ArrayList; im ... -
Java基础一: 自动装箱,折箱、静态导入、可变参数
2010-05-28 18:24 1622自动装,折箱 /** * JDK1.5 自动装箱,折箱 ... -
apache StringUtils常见用法说明
2009-10-28 17:24 44321.空字符串检查使用函数: StringUtils.isBla ... -
产生随机字符串(a-z A-Z 0-9)
2009-09-25 17:47 3113实现方法一: public class RandomFile ... -
计算离当前日期之前或之后任意天的日期
2009-06-18 13:33 1502/** * 日期计算 * * @author z ... -
计算Java日期Date,DateFormat,GregorianCalendar的使用
2009-06-16 17:09 17965概要 不管你是处理财务交易还是计划着下一步的行动,你都要知 ... -
Java计算日期今天,昨天,上周,上月
2009-06-16 16:53 8434功能:今天,昨天,本周,上周,本月,上月 范围:以周一作为一 ... -
@SuppressWarnings(unchecked)作用解释.doc
2009-05-13 09:17 34634解释一: 屏蔽某些编译时的警告信息 ... -
JDK实现AOP动态代码
2009-04-20 14:29 62代理类: import java.lang.refle ...
相关推荐
JAVA 反射机制详解 JAVA 反射机制是 Java 语言中... Java 反射机制提供了一个强大的功能,可以在运行时动态获取类的信息、构造对象、获取成员变量和方法、调用对象的方法等。这样可以大大提高程序的灵活性和扩展性。
通过反射机制,可以在运行时判断任意一个对象所属的类、构造任意一个类的对象、判断任意一个类所具有的成员变量和方法、调用任意一个对象的方法。 反射机制的原理是基于类加载的流程。类加载的完整过程包括编译、...
### JAVA基础-反射-枚举知识点详解 #### 一、反射概述 反射是Java语言提供的一种能在运行时分析类和对象的能力。通过反射,我们可以在程序运行时动态地获取类的信息(如类名、方法、构造函数等)并操作这些信息。 ...
1. **Java基础语法**:这部分可能包括变量声明、数据类型(如基本类型和引用类型)、运算符(算术、比较、逻辑、位运算等)、流程控制语句(如if、switch、for、while)以及方法定义与调用。 2. **类与对象**:试题...
在“Java反射机制2”这个主题中,我们将深入探讨数组与Object的关系、成员方法的反射、成员变量的反射以及数组的反射应用。 1. 数组与Object的关系及其反射类型: 在Java中,所有数组都继承自Object类,这意味着...
2.获取构造方法并调用 3.获取成员方法 4.获取成员变量 5.反射数组 6.通过反射配置文件内容 7.通过反射越过泛型检查 8.其他一些文本笔记 读者需要补充的知识点我来说一下,补充: 1.反射数组应用 2.反射main方法 3....
配置eclispe的编译与运行环境rar在eclispe中配置java模板代码.rar在eclipse中导入已有的工程.rarjava5的静态导入与...对接收数组参数的成员方法进行反射....数组与Object的关系及其反射类型.rar数组的反射应用.rar
Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息,包括但不限于获取类的方法、字段、构造器等,并能动态调用方法和修改字段值。这个特性使得Java具有了更...
通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态地调用这些成员变量和方法。 获取Class对象 ---------------- 在Java中,Class对象是反射机制的基础。我们可以...
使用反射技术可以观察到,数组的类(例如`[I`)实际上继承自`java.lang.Object`类,并且自身没有声明任何成员变量、成员方法、构造函数或注解。这意味着数组类本身非常简单,仅继承了基本的属性和方法。 3. **数组...
Java反射机制主要提供了以下几项核心功能: 1. **动态获取类信息**:可以在运行时判断任意一个对象所属的类,包括该类的所有属性和方法。 2. **动态创建对象**:在运行时可以构造任意一个类的对象,这通常用于框架...
Java反射是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。这个特性使得Java代码能够具备高度的动态性,能够在未知类结构的情况下进行操作,增强了程序的灵活性。在Java中...
* 类和类的成员:属性、方法、构造器、代码块 * 关键字:四大权限修饰符、abstracted等 第3部分:Java SE高级应用程序 * 异常:exception * 集合:ArrayList、HashMap、HashSet * I/O流:input和output * 多线程:...
2. 构造方法:构造方法是类的初始化方法,它用于初始化类的成员变量。 3. 静态变量和实例变量的区别:静态变量是类的成员变量,实例变量是对象的成员变量。 内部类知识点: 1. 内部类:内部类是定义在另一个类中的...
13. **反射**:Java反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于框架和元编程非常重要。 14. **注解**:注解(Annotation)为代码提供了元数据,有助于编译器和构建工具进行代码检查、生成代码或...
Java反射机制是Java编程语言中的一个重要特性,它赋予了程序在运行时检查和操作类、对象、字段和方法的能力。这种动态性使得Java能够在运行时分析和修改代码,增加了编程的灵活性和多样性。 1. **Java反射机制核心...
Java反射机制是Java编程语言中一项强大的工具,它允许程序在运行时检查和操作类、接口、对象等的内部信息。反射机制的核心在于能够在运行时动态地获取类的信息,并且可以动态调用对象的方法,创建对象,甚至修改对象...