- 浏览: 574618 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
拯救各种不开心:
多谢博主分享,已经收藏:http://www.iwwenbo. ...
java反射机制详解 及 Method.invoke解释 -
Santer.Zhang:
你好,我用的是ireport4.5.1,子表一直无法显示
ireport 的一些技巧 -
Ginger90:
ireport实用性上没有帆软报表好用
ireport 的一些技巧 -
lenghongliang001:
破解版不行了,要注册才行
java实现tts(语音开发) -
best_programmer:
得到某个类的静态属性好像用你的方法不对啊,只能使用暴力反射吗? ...
java反射机制详解 及 Method.invoke解释
JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
1. 得到某个对象的属性
public Object getProperty(Object owner, String fieldName) throws Exception { Class ownerClass = owner.getClass(); Field field = ownerClass.getField(fieldName); Object property = field.get(owner); return property; }
Class ownerClass = owner.getClass():得到该对象的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。
2. 得到某个类的静态属性
public Object getStaticProperty(String className, String fieldName) throws Exception { Class ownerClass = Class.forName(className); Field field = ownerClass.getField(fieldName); Object property = field.get(ownerClass); return property; }
Class ownerClass = Class.forName(className) :首先得到这个类的Class。
Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。
Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 执行某对象的方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { Class ownerClass = owner.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName,argsClass); return method.invoke(owner, args); }
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。
5~9行:配置参数的Class数组,作为寻找Method的条件。
Method method = ownerClass.getMethod(methodName, argsClass):通过methodName和参数的argsClass(方法中的参数类型集合)数组得到要执行的Method。
method.invoke(owner, args):执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值。
4. 执行某个类的静态方法
public Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception { Class ownerClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName,argsClass); return method.invoke(null, args); }
基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。
5. 新建实例
public Object newInstance(String className, Object[] args) throws Exception { Class newoneClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Constructor cons = newoneClass.getConstructor(argsClass); return cons.newInstance(args); }
这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。
Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。
第5~第9行:得到参数的Class数组。
Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。
cons.newInstance(args):新建实例。
6. 判断是否为某个类的实例
public boolean isInstance(Object obj, Class cls) { return cls.isInstance(obj); }
7. 得到数组中的某个元素
public Object getByArray(Object array, int index) { return Array.get(array,index); }
评论
好像用你的方法不对啊,只能使用暴力反射吗?
发表评论
-
字符串、图片 与 base64 转化 代码
2010-12-10 15:53 7268一、字符串与base64转化 /** * 用于 BASE ... -
类.class和类对象.getClass()、Class.forName("类名")的区别
2010-11-26 09:54 26161)Class cl=A.class; JVM将使用类A的类装 ... -
System.load 和 System.loadLibrary详解--同时可以解决未加载dll错误
2010-11-09 10:31 3410System.load 和 System.loadLibrar ... -
将斜杠替换为两个斜杠---replaceAll()
2010-05-12 19:31 5905java replaceAll() 方法要用 4 个反斜杠,表 ... -
java中抽象类跟接口的区别
2010-03-18 11:47 8081今天无意在网上看到抽 ... -
解读Tomcat服务器server.xml文件
2009-12-09 12:52 1272<Server port="8005& ... -
jsp页面放到WEB-INF 跟webroot的区别
2009-11-02 16:51 12021JSP存放在 WEB-INF 跟webroot的区别 ... -
jsp的跳转问题(redirect forword include 及区别)
2009-11-02 16:30 2612Forward高, Redirect低, 因为Redirec ... -
java中变量值的变化顺序
2009-10-26 13:33 1363父类--静态变量 父类--静态初始化块 子类--静态变量 子类 ... -
meta用法及robots.txt的讲解
2009-10-13 10:28 1699关于Meta的用法 meta是用来在HTML文档中模拟HTTP ... -
Java关键字final、static使用总结
2009-08-31 13:24 2501Java关键字final、static使用总结 一、final ... -
JNDI是什么
2009-08-31 12:01 1497JNDI是 Java 命名与目录接口(Java Naming ... -
java中的加载器
2009-07-20 10:24 1502java是具有动态性,什么是动态性?有个最直观的例 ... -
synchronized的使用及说明
2009-07-14 15:33 1470synchronized的作用 一、同步方法public sy ... -
浅谈synchronized
2009-07-14 15:25 1095总的说来,synchronized关键字可以作为函数的修饰符, ... -
BufferedReader、FileReader、FileInputStream的区别
2009-07-10 11:48 10741BufferedReader 由Reader类扩展 ... -
JDK动态代理+实例
2009-06-30 16:14 2323拦截器:1、首先要有一个目标对象,要拦截谁2、拦截对象,拦截器 ... -
java中的循环
2009-06-25 16:39 11681.while循环: int i = 1; int sum ... -
form中post和get的区别
2009-06-22 16:45 2002Form中的get和post方法,在数据传输过程中分别对应了H ... -
jspsmart实现文件上传下载
2009-06-18 23:16 577今天弄文件上传的时 ...
相关推荐
java反射机制详解及Method.invoke解释.pdf
java反射机制描述及Method.invoke解释
主要介绍了Java反射机制及Method.invoke详解,本文讲解了JAVA反射机制、得到某个对象的属性、得到某个类的静态属性、执行某对象的方法、执行某个类的静态方法等内容,需要的朋友可以参考下
java.lang.NullPointerException ... at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.tomcat.websocket.pojo.PojoMessageHandlerWholeBase.onMessage(PojoMessageHandlerWholeBase.java:80)
at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144) at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74) at ...
主要介绍了详解Java中Method的Invoke方法,需要的朋友可以参考下
at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397) at org.apache.axis.providers.java.RPCProvider.processMessage...
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) at org.springframework.web.servlet.mvc.method....
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners....
at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable....
jOOR 在java原生的反射基础上进行了简单的封装,使得反射使用方便不少! 举个简单的列子,供大家参考。 java 原生反射写法: try { Method m1 = department.getClass().getMethod("getEmployees"); Employee ...
at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) 2010-11-11 ...
at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable....
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina....
反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。 1. 得到某个对象的属性 public Object getProperty(Object owner, ...
at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:30) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.client....
Java反射反射机制,通过反射,在不修改源代码的情况下实现对类的操作。JAVA反射机制是在运行状态中...这种动态获取信息以及动态调用对象方法(**方法名.invoke(类对象),类似于p.eat()**)的功能称为java语言的反射机制。
Method,invoke,getMethod等反射私有方法和私有属性
[C#]Control.Invoke方法和跨线程访问控件共2页.pdf.zip
at oracle.sysman.emcp.EMDBPostConfig.invoke(EMDBPostConfig.java:227) at oracle.sysman.emcp.EMDBPostConfig.invoke(EMDBPostConfig.java:196) at oracle.sysman.emcp.EMConfig.perform(EMConfig.java:184) ...