- 浏览: 147620 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hacker_zxf:
最近再去看quartz实现,job都是new出来的,如果需要自 ...
Quartz--JAVA计划任务 -
hacker_zxf:
quartz 的扩展型做的不好,本来试图将表达式扩展成支持毫秒 ...
Quartz--JAVA计划任务 -
piaoxue_x:
嗯,看看。。。。貌似不错,谢谢了。。。
Quartz--JAVA计划任务 -
673341766:
麻烦你看一下 红色的信息是报错好吧.
Quartz--JAVA计划任务 -
helong0904:
...
spring quartz配置定时器
定义一个用户,作为被反射对象;
写一个反射程序:
输出结果:
这里有几个问题:
1.为什么每次都要把参数组织一边,如
2.为什么最后为什么会报错呢
思考下.....
==================================
1> 引用下侯捷对Class的解释:
Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types
(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class object。
循环是对Class对应参数的定义,每一个参数加载后都会是一个Class(不知道是否应该如此理解,如有错误,请指正);
2.发现age如果为Integer 的话,就可以了
运行结果:
那就是说,构造函数里面,基本类型是不支持反射的;
public class User { public String username; private String password; public static int age = 12; public User(String username, String password) { super(); this.username = username; this.password = password; } public User(String username, int age) { super(); this.username = username; User.age = age; } public String getUsername() { return username; } public User() { super(); } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public void talkName(String myName) { if (myName != null && myName.length() > 0) { System.out.println("myname is " + myName); } else { System.out.println("myname is " + username); } } public static void talkAge() { System.out.println("My age is " + age); } }
写一个反射程序:
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author <a href="mailto:zhouxiaofeng0710@hotmail.com">xiaofeng.zhouxf</a> * @version 1.0 * @date 2009-4-20 */ public class ReflectionTest { public void fields(Object obj) { Class clazz = obj.getClass(); Field[] fields = clazz.getFields(); System.out.println("fields; fields num:" + fields.length); for (Field field : fields) { System.out.println("fields; field name:" + field.getName()); System.out.println("fields; field modifyers:" + field.getModifiers()); System.out.println("fields; 只能取到共有的属性!"); } } public Object getfield(Object obj, String fieldName) { Class clazz = obj.getClass(); Object object = null; try { Field field = clazz.getField(fieldName); // 取得当前实例的属性 object = field.get(obj); System.out.println("getfield ; field name:" + field.getName()); System.out.println("getfield ; field value:" + object.toString()); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return object; } public Object getStatticfield(String className, String fieldName) { Class clazz = null; try { clazz = Class.forName(className); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Object object = null; try { Field field = clazz.getField(fieldName); // 取得当前类的属性 因为是取静态的,所以可以直接取,如果不是静态的,会报异常 // java.lang.IllegalArgumentException object = field.get(clazz); System.out.println("getStatticfield ; field name:" + field.getName()); System.out.println("getStatticfield ; field value:" + object.toString()); System.out.println("getStatticfield ; 取得当前类的属性 因为是取静态的,所以可以直接取,如果不是静态的,会报异常:java.lang.IllegalArgumentException"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return object; } public void invokeMethod(Object object, String methodName, Object[] argsParam) { try { Class clazz = object.getClass(); Class[] classArgs = new Class[argsParam.length]; int i = 0; for (Object obj : argsParam) { classArgs[i++] = obj.getClass(); } Method method = clazz.getMethod(methodName, classArgs); method.invoke(object, argsParam); System.out.println("invokeMethod ; 调用当前类的方法"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void invokeStaticMethod(String className, String methodName, Object[] argsParam) { try { Class clazz = Class.forName(className); Class[] classArgs = new Class[argsParam.length]; int i = 0; for (Object obj : argsParam) { classArgs[i++] = obj.getClass(); } Method method = clazz.getMethod(methodName, classArgs); method.invoke(null, argsParam); System.out.println("invokeMethod ; 调用当前类的方法"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public Object newInstance(String className, Object[] args) { Class clazz = null; Object resObj = null; try { clazz = Class.forName(className); Class[] cArgs = new Class[args.length]; int i = 0; for (Object obj : args) { cArgs[i++] = obj.getClass(); } Constructor cr = clazz.getConstructor(cArgs); resObj = cr.newInstance(args); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return resObj; } public static void main(String[] args) { User user = new User(); user.setUsername("Tracy"); ReflectionTest test = new ReflectionTest(); System.out.println("=============取属性==================>>>>>"); test.fields(user); System.out.println("=============取实例的属性和值==================>>>>>"); String username = (String) test.getfield(user, "username"); System.out.println("getfield ; username:" + username); System.out.println("=============取类的静态属性和值==================>>>>>"); test.getStatticfield("com.zhouxf.reflection.User", "age"); System.out.println("=============调用类的方法==================>>>>>"); test.invokeMethod(user, "talkName", new String[] { "Tracy" }); System.out.println("=============调用类的静态方法==================>>>>>"); test.invokeStaticMethod("com.zhouxf.reflection.User", "talkAge", new String[] {}); System.out.println("=============创建实例==================>>>>>"); User user1 = (User) test.newInstance("com.zhouxf.reflection.User", new Object[] { "tracy", 36 }); user1.talkName(""); user1.talkAge(); } }
输出结果:
=============取属性==================>>>>> fields; fields num:2 fields; field name:username fields; field modifyers:1 fields; 只能取到共有的属性! fields; field name:age fields; field modifyers:9 fields; 只能取到共有的属性! =============取实例的属性和值==================>>>>> getfield ; field name:username getfield ; field value:Tracy getfield ; username:Tracy =============取类的静态属性和值==================>>>>> getStatticfield ; field name:age getStatticfield ; field value:12 getStatticfield ; 取得当前类的属性 因为是取静态的,所以可以直接取,如果不是静态的,会报异常:java.lang.IllegalArgumentException =============调用类的方法==================>>>>> myname is Tracy invokeMethod ; 调用当前类的方法 =============调用类的静态方法==================>>>>> My age is 12 invokeMethod ; 调用当前类的方法 =============创建实例==================>>>>> java.lang.NoSuchMethodException: com.zhouxf.reflection.User.<init>(java.lang.String, java.lang.Integer)
这里有几个问题:
1.为什么每次都要把参数组织一边,如
Class[] classArgs = new Class[argsParam.length]; int i = 0; for (Object obj : argsParam) { classArgs[i++] = obj.getClass(); }
2.为什么最后为什么会报错呢
思考下.....
==================================
1> 引用下侯捷对Class的解释:
Class class十分特殊。它和一般classes一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types
(boolean, byte, char, short, int, long, float, double)以及关键词void。当一个class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM 便自动产生一个Class object。
Class[] classArgs = new Class[argsParam.length]; int i = 0; for (Object obj : argsParam) { classArgs[i++] = obj.getClass(); }
循环是对Class对应参数的定义,每一个参数加载后都会是一个Class(不知道是否应该如此理解,如有错误,请指正);
2.发现age如果为Integer 的话,就可以了
public class User { public String username; private String password; public static Integer age = 12; public User(String username, String password) { super(); this.username = username; this.password = password; } public User(String username, Integer age) { super(); this.username = username; User.age = age; } public String getUsername() { return username; } public User() { super(); } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public void talkName(String myName) { if (myName != null && myName.length() > 0) { System.out.println("myname is " + myName); } else { System.out.println("myname is " + username); } } public static void talkAge() { System.out.println("My age is " + age); } }
运行结果:
=============创建实例==================>>>>> myname is tracy My age is 36
那就是说,构造函数里面,基本类型是不支持反射的;
发表评论
-
JAVA 应用监控
2011-11-17 15:09 1130监控一个应用可以有很多好处,xxxxx 这里就不说了 不同应 ... -
顺序打印ABC,连续打10次
2011-06-14 22:23 1599import java.util.concurrent.ato ... -
JVM内存模型以及垃圾回收教程概述【转】
2011-01-18 15:21 971摘自:http://www.zhixing123. ... -
JAVA并发编程(一) 并发基础
2011-01-05 19:32 9704. 组合对象线程安全 4.1 设计线程安全的类 使用公共 ... -
[转]JAVA语言的反射和内省
2010-11-25 12:04 749转自: http://blog.csdn.net/ ... -
java 强、软、弱、虚引用
2010-11-18 22:54 10371.强引用 本章前 ... -
计算机常识:字符编码简介——ASCII、Unicode、UTF-8、GB2312
2010-11-03 14:40 1275字符编码简介:ASCII,Unicode,UTF-8,GB23 ... -
Apache Log4j配置说明
2010-10-25 21:00 695Apache Log4j配置说明 摘自Blog: http:/ ... -
初試 cglib
2010-04-25 21:00 747public class Man { public S ... -
java.lang.reflect 动态代理
2010-04-25 20:01 860public interface IReport { ... -
META-INF中的MANIFEST.MF的作用
2010-03-28 18:21 1241MANIFEST中的配置信息共有下面几类:一. 一般属性1. ... -
JAVA的容器---List,Map,Set
2009-12-22 22:09 732JAVA的容器---List Map Set Coll ... -
annotation 例子
2009-11-28 05:29 969@Retention : RetentionPolicy. S ... -
JAVA 同步 (一)
2009-11-09 21:36 681永远只能更新对象的成员变量时加锁 永远只能在访问有可能被更新对 ... -
JAVA中枚举(Enum)的系列文章 - 反向查找、总结
2009-05-12 14:00 1851转自:http://www.sinojava.co ... -
两个反射的小例子
2009-04-15 16:04 928HashMap map = new HashMap(); ... -
utf转UnicodeBig
2008-12-23 20:06 938今天遇到一个奇怪的问题,代码如下: public ... -
ResourceBundle例子
2008-12-22 15:41 1482public class TestResourceBundle ... -
eclipse new class注释模板
2008-12-19 13:10 1411/** * @{#} ${file_n ... -
CountDownLatch 线程助手
2008-12-10 13:38 1178JAVA API (CountDownLatch) clas ...
相关推荐
在探讨“简单的反射例子”这一主题时,我们深入解析了反射在C#中的应用,以及如何利用反射来访问和操作对象的属性。反射是.NET框架中的一个强大特性,它允许程序在运行时检查和调用类型的信息,包括类型、方法、属性...
在标题和描述中提到的“java反射例子,封装了一个反射帮助类”,这表明我们有一个实用工具类,可以帮助简化使用反射的复杂过程。 首先,让我们理解Java反射的基本概念。当我们的程序运行时,我们可以通过Class类来...
在这个"nginx反射例子"中,我们将深入探讨如何利用Nginx实现反射(也称为回显)功能,这是一种将接收到的请求数据原封不动地返回给客户端的技术。 反射功能在测试、调试和安全研究中非常有用,可以帮助我们理解网络...
下面是一个简单的PHP反射例子,展示了如何使用反射来获取并调用私有方法: ```php class MyClass { private $value = 42; private function secretMethod($add) { return $this->value + $add; } } $instance...
这个"C#(2.0)反射例子"是针对Visual Studio 2005的一个实例,旨在帮助开发者深入理解反射的基本概念和实际应用。在这个项目中,我们将探讨以下几个关键知识点: 1. **类型信息获取**:反射允许程序在运行时获取...
这个"详细的C#反射例子(项目文件)"显然包含了关于如何使用C#反射的实际应用示例,这对于理解并掌握这一核心概念至关重要。 反射允许程序员在运行时执行以下操作: 1. **获取类型信息**:通过Type类,可以获取...
java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier;
考虑到这是一个简单的反射例子,`ReflectTest.java`可能包含以下内容: ```java public class ReflectTest { public String echo(String msg) { return "Echo: " + msg; } public static void main(String[] ...
"反射例子 reflector"这个主题深入浅出地展示了如何利用C#的反射功能来增强代码的灵活性和动态性。下面我们将详细探讨反射的概念、用途,以及如何在实际编程中运用。 首先,反射允许我们动态地获取类型信息。在C#中...
在这个“面向接口的反射例子”中,我们将深入探讨ASP.NET中的两个关键概念:面向接口编程和反射。 首先,面向接口编程(Interface-Oriented Programming, IOP)是面向对象编程的一种策略,它强调设计和实现时以接口...
这个“一个C#反射例子附源码”的资源提供了一个具体的实例,帮助开发者深入理解如何在实际项目中使用反射。下面我们将详细探讨C#反射的相关知识点。 1. **什么是反射**: 反射是.NET框架提供的功能,它允许程序在...
首先,从标题“java反射例子”来看,这部分内容将围绕Java反射技术的具体应用展开。Java反射API提供的主要类包括java.lang.Class、java.lang.reflect.Constructor、java.lang.reflect.Method和java.lang.reflect....
这个例子(源码)提供了深入理解C#反射机制的机会。以下是对标题和描述中涉及知识点的详细解释: 1. **什么是反射?** 反射是程序在运行时获取自身信息的能力,包括类、接口、属性、方法等元数据。它允许我们动态...
### C#反射技术详解 #### 一、反射技术概述 反射是C#中一项非常强大的功能,它允许程序在运行时动态地获取自身的类型信息、方法、属性等,并且能够创建对象实例、调用方法、设置或获取字段值等。这种能力在很多...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Spring框架中,反射扮演着核心角色,...希望这个简单的反射例子能帮助你更好地理解和运用Java反射。
JAVA反射机制及应用例子.。。Reflection API
在Java编程语言中,反射(Reflection)是一种强大的工具,允许程序在运行时检查和操作类、接口、字段和方法的信息。它使得开发者能够编写更加灵活和动态的代码,可以处理未知类型的数据,或者在不修改源代码的情况下...
C#反射是一个强大的工具,它允许程序在运行时获取类型信息、创建对象、调用方法以及访问和修改字段。在C#中,反射是通过System.Reflection命名空间中的类来实现的。下面我们将深入探讨C#反射的核心概念和常用操作。 ...
在.NET框架中,C#反射是一种强大的特性,它允许运行时的代码检查自身,并与自身交互,无需在编译时知道具体的类型信息。这个特性在许多场景下都非常有用,例如在插件系统、序列化、元数据操作以及动态类型创建等。在...
在C#编程中,反射是一种强大的机制,它允许运行时的程序检查自身并操作其类型信息。通过反射,我们可以动态地创建对象、调用方法、访问属性和字段,以及加载和执行Assembly。这个主题对于任何想要提升编程技能的C#...