- 浏览: 79983 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
hanlingbo2008:
问题:
空中巴士(airbus)、波音(Boeing)、麦道 ...
桥梁(Bridge)模式 -
hanlingbo2008:
从Enueration到Iterator的适配
publ ...
适配器模式(Adapter) -
hanlingbo2008:
从Iterator到Enueration的适配
publ ...
适配器模式(Adapter)
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
Class类:代表一个类。java.lang.Class
Field 类:代表类的成员变量(成员变量也称为类的属性)。java.lang.reflect.Field
Method类:代表类的方法。java.lang.reflect.Method
Constructor 类:代表类的构造方法。java.lang.reflect.Constructor
Array类:提供了动态创建数组,以及访问数组的元素的静态方法.java.lang.reflect.Array
Class对象的获得途径
1、众所周知Java有个Object class,是所有Java classes的继承根源,其内声明了数个应该在所有Java class中被改写的methods:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class object。
eg:String str = "abc"; Class class = str.getClass(); Class class = str.getSuperClass();
2、运用Class.forName("对象名");
eg: Class c = Class.forName("java.lang.String");
3、.class 用法
eg: Class c = java.lang.String.class; Class c2 = int.class; Class c3 = int[].class
4、运用primitive wrapper classes的TYPE语法
eg: Class c1 = Boolean.TYPE;
Class c2 = String.TYPE;
Class c3 = Integer.TYPE;
Class c4 = Float.TYPE;
Class c5 = Double.TYPE;
Class c6 = Long.TYPE;
Class c7 = Byte.TYPE;
Class c8 = Short.TYPE;
Class c9 = Void.TYPE;
运行时生成instances
欲生成对象实体,在Reflection 动态机制中有两种作法,一个针对“无自变量ctor”,一个针对“带参数ctor”。如果欲调用的是“带参数ctor“就比较麻烦些,不再调用Class的newInstance(),而是调用Constructor 的newInstance()。首先准备一个Class[]做为ctor的参数类型,然后以此为自变量调用getConstructor(),获得一个专属ctor。接下来再准备一个Object[] 做为ctor实参值,调用上述专属ctor的newInstance()。
运行时调用methods
这个动作和上述调用“带参数之ctor”相当类似。首先准备一个Class[]做为参数类型,然后以此为自变量调用getMethod(),获得特定的Method object。接下来准备一个Object[]放置变量,然后调用上述所得之特定Method object的invoke()。为什么获得Method object时不需指定回返类型?因为method overloading机制要求signature必须唯一,而回返类型并非signature的一个成份。换句话说,只要指定了method名称和参数列,就一定指出了一个独一无二的method。
运行时变更fields内容
与先前两个动作相比,“变更field内容”轻松多了,因为它不需要参数和自变量。首先调用Class的getField()并指定field名称。获得特定的Field object之后便可直接调用Field的get()和set()
例子代码:
/*通过一个参数导出参数所指定的对象的所有方法*/ public class DumpMethod { public static void main(String [] args)throws Exception{ Class<?> classType = Class.forName(args[0]); Method[] methods = classType.getDeclaredMethods(); for(int i = 0;i<methods.length;i++){ System.out.println(methods[i].toString()); } } }
import java.lang.reflect.Method; /*测试方法调用*/ public class InvokerTest { 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 = InvokerTest.class; //创建一个新对象 Object createObj = classType.newInstance(); //由Class生成指定名字和参数的方法 Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class}); Object result = addMethod.invoke(createObj, new Object[]{new Integer(100),new Integer(200)});//装箱和拆箱 //Object result = addMethod.invoke(createObj, new Object[]{100,200});//装箱和拆箱 System.out.println("result:" + result); Method echoMethod = classType.getMethod("echo", new Class[]{String.class}); result = echoMethod.invoke(createObj,new Object[]{"Hello Boy!"}); System.out.println(result); } }
import java.lang.reflect.Field; import java.lang.reflect.Method; /*反射测试*/ public class TestReflect { public static Object copy(Object obj) throws Exception{ Class<?> classType = obj.getClass(); System.out.println("classType = " + classType.getName()); //运用默认的构造方法生成一个对象 //Object copyObj = classType.getConstructor(new Class[]{}).newInstance(new Object [] {}); //运用含参数的构造方法生成一个对象 Object copyObj = classType.getConstructor(new Class[]{String.class,long.class}).newInstance(new Object[]{"BOB",2l}); Field[] fields = classType.getDeclaredFields(); for(int i=0; i<fields.length;i++){ Field field = fields[i]; String fieldname = field.getName();//得到方法名 if("age".equalsIgnoreCase(fieldname)){ String getMethodName = "get" + fieldname.substring(0,1).toUpperCase() + fieldname.substring(1); String setMethodName = "set" + fieldname.substring(0,1).toUpperCase() + fieldname.substring(1); Method getMethod = classType.getMethod(getMethodName, new Class[]{}); Method setMethod = classType.getMethod(setMethodName, new Class[]{field.getType()}); Object value = getMethod.invoke(obj, new Object[]{}); setMethod.invoke(copyObj, new Object[]{value}); } } return copyObj; } public static void main(String[] args) throws Exception{ User user = new User("Tom", 1l); user.setAge(20); User u = (User)TestReflect.copy(user); System.out.println("copyUser.username:" + u.getUsername() + " id:" + u.getId() + " age: " + u.getAge()); } } class User{ private String username; private long id; private int age; public User(){ } public User(String username, long id){ this.username = username; this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
发表评论
-
java.io包学习1
2008-11-27 10:23 1181转自:http://www.blogjava.net/cher ... -
java.io包学习
2008-11-27 10:22 12831. java.io 包中定义了多个流类型来实现输入和输出功 ... -
15、装饰模式(Decorator)
2008-11-25 11:57 720装饰模式(Decorator)使用原来被装饰的类的一个子类的实 ... -
14.1、安全合成模式和透明合成模式
2008-11-25 11:33 832安全合成模式代码: public interface Comp ... -
14. 合成模式(composite)
2008-11-25 11:27 1086合成模式(composite)把部分和整体的关系用树结构表示出 ... -
java八种基本类型
2008-11-24 11:55 5777Java语言提供了八种基本类型。六种数字类型(四个整数型,两个 ... -
命令模式(Command)例子2增加宏命令
2008-11-23 12:00 1209命令模式(Command)例子2增加宏命令 为julia的 ... -
命令(Command)模式例子2
2008-11-23 11:47 983命令(Command)模式例子2 -------- Audio ... -
java内的命令(Command)模式例子
2008-11-23 11:17 1545命令模式例子------创世纪系统 系统开始时,世界是个黑 ... -
命令(Command)模式
2008-11-23 10:59 94513、命令(Command)模式 命令模式( ... -
JDOM对xml文件的读写API
2008-11-18 11:05 1448根据jdom自带的例子总结 1. org.jdom.in ... -
JDOM对xml文件的读写
2008-11-18 10:19 20641. 读取例子 xml文件代码 <?xml ve ... -
java语言对观察者模式的支持
2008-11-17 17:32 82412.1 java语言对观察者模式的支持 ... -
Java 语言的反射机制
2008-11-16 12:22 675在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属 ... -
模板方法模式中的方法
2008-11-15 22:50 74111.2 、模板方法模式中的方法 基本方法: 抽象方 ... -
模板方法模式的一个例子
2008-11-15 22:34 111911.1 模板方法例子 考虑一个银行存款例子 ... -
模板(Template Method)方法模式
2008-11-15 22:11 91411、模板(Template Method)方法模式 ... -
不变(Immutable)模式
2008-11-15 21:44 80410、不变(Immutable)模式 定义: ... -
桥梁(Bridge)模式
2008-11-15 13:01 10329、桥梁(Bridge)模式 桥梁模式的结构 ... -
门面模式(Facade)
2008-11-15 12:21 11138、门面模式(Facade) 门面角色(Facade): 供 ...
相关推荐
Java反射机制与动态代理 浪曦 Java Reflection API 简介 及动态代理
JavaReflectionTuto Java Reflection API入门教程
B.1 Java Reflection API简介 B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件 C.1 创建带有@hibernate标记的Java源文件 C.2 建立项目的目录结构 C.3 运行XDoclet工具 附录D ...
B.1 Java Reflection API简介 B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件 C.1 创建带有@hibernate标记的Java源文件 C.2 建立项目的目录结构 C.3 运行XDoclet工具 附录D ...
B.1 Java Reflection API简介 B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件 C.1 创建带有@hibernate标记的Java源文件 C.2 建立项目的目录结构 C.3 运行XDoclet工具 附录D ...
B.1 Java Reflection API简介 B.2 运用反射机制来持久化Java对象 附录C 用XDoclet工具生成映射文件 C.1 创建带有@hibernate标记的Java源文件 C.2 建立项目的目录结构 C.3 运行XDoclet工具 附录D ...
java-android-orm-db-example 该项目显示了使用某些设计模式和Java Reflection API的自定义ORM实现
自己尝试开发的0.1版游戏引擎,包含对lwjgl库的简单引用,AIO通信的封装,应用reflection对插件进行自动探测,实现了一个java网络游戏的简单骨架。
Java语言的反射机制 Java Reflection API
详细讲解Java的反射机制,包括Reflection API、在远程方法调用中运用反射机制、代理模式,后面还有一些练习和答案
ReflectionApiStudy 此存储库旨在研究Java的Reflection Api。 回购的工作方式: -每个想要将其研究保存在此存储库中的人都将创建一个带有名称/用户名的文件夹,并将所有研究保存在该文件夹中,例如:root -willmenn ...
Java Mail API Chapter 16. Applets Chapter 17. Java XML-RPC Chapter 18. Java and SOAP PART III: ENTERPRISE JAVA Chapter 19. Security Chapter 20. Servlet Chapter 21. Java Server Pages Chapter 22. Java...
本章首先介绍了Java Reflection API的用法,然后介绍了一个远程方法调用的例子,在这个例子中客户端能够远程调用服务器端的一个对象的方法。服务器端采用了反射机制提供的动态调用方法的功能,而客户端则采用了反射...
JAVA反射机制及应用例子.。。Reflection API
是被视为动态语言的关键,反射机制允许程序在执行期借助Reflection API取得任何类的内部信息并能直接操作任意对象的内部属性及方法。 java反射机制所提供的功能: 生成动态代理 在运行时判断任意一个对象所属的类 在...
jOOR - Fluent Reflection in Java jOOR is a very simple fluent API that gives access to your Java Class structures in a more intuitive way. The JDK's reflection APIs are hard and verbose to use. Other ...
Preferences API Ref Objects Reflection Regular Expressions Versioning Zip Instrumentation Java Virtual Machine Java HotSpot Client and Server VM Description of Java Conceptual Diagram What's ...
NULL 博文链接:https://1598623317.iteye.com/blog/2087516
Tasdik是使用Java Reflection API的bean (JavaBean, POJO)验证库。 快速安装 如果使用的是Maven ,则可以通过将以下XML添加到项目pom.xml文件中来添加存储库。 < groupId>com.github.enesusta</ groupId> ...