- 浏览: 313196 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (243)
- Core Java (13)
- Java (12)
- Android (2)
- Lucene (3)
- J2EE (3)
- Hibernate (2)
- Jsp & Servlet (3)
- Struts2 (3)
- Spring (5)
- JSF (6)
- RichFaces (2)
- HTML & JS & DOM & CSS (87)
- browser (1)
- Ajax & A4J (2)
- Workflow (1)
- Maven (3)
- Linux (2)
- VM & VBOX (1)
- Tomcat (1)
- Cache (3)
- Others (36)
- design (1)
- PHP (1)
- Try.js (1)
- HTML5 && CSS3 && ECMAScript5 (26)
- 疯言疯语 (5)
- mongodb (2)
- Hardware Common Sence (1)
- RESTful (3)
- Nginx (2)
- web安全 (8)
- Page Design (1)
- web performance (1)
- nodejs (4)
- python (1)
最新评论
-
New_Mao_Er:
求最新的版本破解啊!!!
Omondo eclipseUML插件破解 -
konglx:
讲得仔细,谢了
全面分析 Spring 的编程式事务管理及声明式事务管理 -
cilendeng:
对所有post有效只能使用过滤器
说说Tomcat的Server.xml的URIEncoding=‘UTF-8’配置 -
jiulingchen:
mark了,灰常感谢!
JAVA中最方便的Unicode转换方法 -
anlaetion:
这算法可以有
js 字符串搜索算法
欲生成对象实体,在Reflection 动态机制中有两种作法,一个针对“无自变量ctor”,一个针对“带参数ctor”。如果欲调用的是“带参数ctor“就比较麻烦些,不再调用Class的newInstance(),而是调用Constructor 的newInstance()。首先准备一个Class[]做为ctor的参数类型,然后以此为自变量调用getConstructor(),获得一个专属ctor。接下来再准备一个Object[] 做为ctor实参值,调用上述专属ctor的newInstance()。
下面做个例子,该例子的反射对象没有构造方法(实际上是默认的构造方法),无自变量,动态生成“Class object 所对应之class”的对象实体,代码如下:
首先建立com.lansin.ghk包,在其下建立两个类:Person.java和Test1.java。
package com.lansin.ghk; public class Person{ private String name; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "名称为" + this.getName() + ", 地址为" + this.getAddress(); } }
package com.lansin.ghk; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Test1 { public static void main(String[] args) throws Exception { Class<?> classType = Class.forName("com.lansin.ghk.Person"); Object obj = null; obj = classType.newInstance(); Field fields[] = classType.getDeclaredFields(); for(int i=0; i<fields.length;i++){ Field field = fields[i]; String fieldName = field.getName(); String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getMethodName = "get" + firstLetter + fieldName.substring(1); String setMethodName = "set" + firstLetter + fieldName.substring(1); Method getMethod = classType.getMethod(getMethodName); Method setMethod = classType.getMethod(setMethodName,field.getType()); if("name".equals(fieldName)){ setMethod.invoke(obj, "迈克·泰森"); } else if("address".equals(fieldName)){ setMethod.invoke(obj, "美国"); } } System.out.println(obj); } }
运行结果为:“名称为迈克·泰森, 地址为美国”。
下面做个例子,该例子的反射对象包含构造方法,有自变量,动态生成“Class object 所对应之class”的对象实体,代码如下:
有构造方法的Person类只需在上面的Person类里加一个构造方法;Test2类“反射”Person。
package com.lansin.ghk; public class Person{ private String name; private String address; public Person(String name, String address){ this.name = name; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "名称为" + this.getName() + ", 地址为" + this.getAddress(); } }
package com.lansin.ghk; import java.lang.reflect.Constructor; public class Test2 { public static void main(String[] args) throws Exception { Class<?> c = Class.forName("com.lansin.ghk.Person"); Class[] pTypes = new Class[]{String.class, String.class}; Constructor ctor = c.getConstructor(pTypes); Object obj = null; Object[] arg = new Object[]{"迈克·泰森", "美国"}; obj = ctor.newInstance(arg); System.out.println(obj); } }
运行,和上个程序结果一样:“名称为迈克·泰森, 地址为美国”。
比较上面两段程序:首先要提供一个对象类的地址全称(包名+类名)。
(一)对于没有构造函数的类,在运行时刻创建该对象所属类的对象实例:
先声明一个泛型Class,
Class<?> classType = Class.forName("com.lansin.ghk.Person");
然后由泛型对象classType生成实例,
Object obj = classType.newInstance();
接下来调用反射机制提供的各种方法进行动态处理;
(二)对于有构造函数的类,在运行时刻创建该对象所属类的对象实例:
同样要先声明一个泛型Class,
Class<?> classType = Class.forName("com.lansin.ghk.Person");
创建一个“类型类”集合,因为Person类的构造函数有两个string类型的形参,
Class[] pTypes = new Class[]{String.class, String.class};
接下来由生成的“由对象在运行时所生成所属类的对象”来创建一个带有形参(是个集合)的构造器,
Constructor ctor = classType .getConstructor(pTypes);
最后由构造器生成一个实例对象,但是首先要设定实参,
设定实参:Object[] arg = new Object[]{"迈克·泰森", "美国"};
实例化对象:Object obj = ctor.newInstance(arg);
OK了。
其实到这里我还有很多细节没有说,这个要在以后的工作中多多学习,多多参考文档,java api是个好东西。
下面的例子是在运行时调用Method,代码如下:
public class InvokeTester { public int add(int param1, int param2) { return param1 + param2; } public String echo(String msg) { return "echo: " + msg; } public static void main(String[] args) throws Exception { Class<?> classType = InvokeTester.class; Object invokeTester = classType.newInstance(); // 调用InvokeTester对象的add()方法 Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class }); Object result = addMethod.invoke(invokeTester, new Object[] { new Integer(100), new Integer(200) }); System.out.println((Integer) result); // 调用InvokeTester对象的echo()方法 Method echoMethod = classType.getMethod("echo", new Class[] { String.class }); result = echoMethod.invoke(invokeTester, new Object[] { "Hello" }); System.out.println((String) result); } }
这个动作和上述调用“带参数之ctor”相当类似。首先准备一个Class[]做为参数类型(本例指定其中一个是String,另一个是Hashtable),然后以此为自变量调用getMethod(),获得特定的Method object。接下来准备一个Object[]放置自变量,然后调用上述所得之特定Method object的invoke()。
为什么获得Method object时不需指定回返类型?
因为method overloading机制要求signature必须唯一,而回返类型并非signature的一个成份。换句话说,只要指定了method名称和参数列,就一定指出了一个独一无二的method。
下面的类是运行时变更Field的内容,比较简单,代码如下:
package com.lansin.ghk; import java.lang.reflect.Field; public class TestField { public double d; public static void main(String[] args) throws Exception { Class c = Class.forName("com.lansin.ghk.TestField"); Field f = c.getField("d"); TestField obj = new TestField(); System.out.println("d= " + (Double)f.get(obj)); f.set(obj, 12.34); System.out.println("d= " + obj.d); } }
与先前两个动作相比,“变更field内容”轻松多了,因为它不需要参数和自变量。首先调用Class的getField()并指定field名称。获得特定的Field object之后便可直接调用Field的get()和set()。
[转自:http://phoenix-ghk.iteye.com/blog/392987]
发表评论
-
Java 强制类型转换
2012-07-29 22:22 1093当两个整数相除时,小数点以后的数字会被截断,使得运算的结 ... -
Java 自动类型转换
2012-07-29 21:41 1802在程序中已经定义好了数据类型的变量,若是想用另一种数据类 ... -
Java 数据类型
2012-07-27 15:31 723看图说话: 如果想在程序中使用一个变量,就必须先声明 ... -
理解ThreadLocal
2010-07-23 17:29 689概述 我们知道Sprin ... -
String,StringBuffer ,StringBuilder类型区别
2010-04-21 09:42 887String 字符串常量 Strin ... -
JAVA内存泄露
2009-10-14 19:28 2662[转自 :http://www.tech-q.cn/ ... -
对象流(序列化)
2009-08-27 09:41 940摘于《JAVA2核心技术第1卷》p618 - p620。具体见 ... -
java反射机制与动态代理(三)
2009-08-19 09:25 2318本文讲述代理模式... 代理模式的作用是:为其他对象提供一种 ... -
java反射机制与动态代理(一)
2009-08-19 09:10 3510前言,在Java运行时刻,能否知道一个类的属性方法并调用改动之 ... -
Java线程:线程的同步
2009-07-28 17:35 738一、同步问题提出 ... -
java中Class.getResource用法
2009-07-26 00:23 8746用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还 ... -
Class.forName
2009-07-22 12:24 823Class.forName(xxx.xx.xx) 返回的 ...
相关推荐
java反射机制和动态代理的原理,熟悉反射机制和动态代理
Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...
JAVA反射机制与动态代理.part04
Java反射机制与动态代理是Java编程中的重要概念,它们在软件设计中扮演着核心角色,尤其是在框架开发中。本文将深入探讨这两个主题,以及如何在实际应用中利用它们。 首先,我们来理解Java反射机制。反射是Java的一...
总的来说,Java反射机制和动态代理是Java平台强大而灵活的特性,它们使得Java程序能够在运行时具有更高的灵活性和可扩展性。然而,使用反射也可能带来性能开销和安全风险,因此在实际应用中需要权衡利弊,合理使用。
总结来说,Java反射机制和动态代理是Java编程中不可或缺的部分,它们极大地扩展了Java的灵活性和可扩展性,使得程序员可以在运行时对程序进行更深层次的控制。了解和熟练掌握这两项技术,对于提高Java开发能力和解决...
JAVA反射机制与动态代理.part02
JAVA反射机制与动态代理.part01
JAVA反射机制与动态代理.part03
JAVA反射机制与动态代理.part05
#### 一、JAVA反射机制概述 JAVA的反射机制是一种强大的功能,允许程序在运行时获取类的信息并操作类的对象。这种能力在很多情况下非常有用,比如在进行代码框架设计时,我们经常需要在运行时根据不同的条件选择...
1. 动态代理原理:动态代理是基于Java反射机制,通过在运行时动态生成实现了特定接口的代理类,以此来实现对原对象的代理。 2. java.lang.reflect.Proxy类:Proxy类提供了创建动态代理类和代理对象的工厂方法。通过...
JAVA反射机制与动态代理.part07
JAVA反射机制与动态代理.part09
JAVA反射机制与动态代理.part06
JAVA反射机制与动态代理.part08