- 浏览: 276094 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
donglc:
看不懂,lz你懂不?
DSOFramer.ocx 控件使用 -
xiaoduo2048:
版本太旧了,只能做为一个参考,好多介绍现在的版本里还要好好找找 ...
jasperReport iReport中文教程 -
longzaitian:
谢了,网上关于birt的资料比较少!
Birt入门教程使用说明 -
YYang5968:
request.getSession().getServlet ...
getServletContext().getRealPath() 和request.getRealPath -
OnePiece_2012:
灰常好
mysql 工具--HB-SQLyogEnt
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;
- }
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;
- }
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);
- }
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);
- }
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);
- }
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. 得到数组中的某个元素
发表评论
-
Eclipse插件安装的3种方法
2012-05-12 11:55 662Eclipse插件安装的3种方法 Eclip ... -
性能优化 .
2012-04-23 16:41 7211.不用new关键词创建类 ... -
java 内存分配
2012-04-23 13:12 797程序的内存分配 一个由c/C++编译的程序占用的内存分为以 ... -
java中会存在内存泄漏吗,请简单描述。 .
2012-04-23 13:06 829会。java导致内存泄露的原因很明确:长生命周期的对象持有短生 ... -
Java集合类详解 .
2012-01-30 17:02 826集合类说明及区别Collection├List│├Linked ... -
java doc
2012-01-29 16:50 784<!-- Amazon Ad --><!-- ... -
java反射机制详解 及 Method.invoke解释 getMethod
2011-07-01 09:34 1797JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一 ... -
Eclipse使用秘笈-快捷键使用大全
2011-01-28 17:28 770编辑作用域 功能 快捷键 全局 查找并替换 Ctrl+F ... -
.NET开发人员必知的八个网站
2010-12-19 11:40 685当前全球有数百万的开发人员在使用微软的.NET技术。如果你 ... -
Java开源CMS系统
2010-12-19 11:36 3621InfoGlue infoglue ... -
几款java快速开发平台的比较
2010-12-19 11:29 2130几款java快速开发平台 ... -
myeclipse快捷键大全
2010-03-15 12:02 1013myeclipse快捷键大全 1.转变大写:ctrl+shi ... -
Eclipse 删空configuration文件夹后启动报错的解决
2010-03-04 11:35 1546Eclipse 删空configuration文件夹后启动报错 ... -
不错的java反编译工具 绿色
2009-12-24 11:08 1875java反编译工具,绿色反编译工具。 好坏不用多说,用过就知 ... -
native2ascii 用法
2009-06-26 15:21 1467native2ascii [-reverse] [-encod ... -
JAVA程序员面试32问
2009-03-10 13:27 709第一,谈谈final, finally, finali ... -
Java heap space 解决方法
2009-03-04 14:20 1086java.lang.OutOfMemoryError: Jav ... -
java 读取文件转换为字符串
2008-11-28 17:20 3441public String selfReadFile( ...
相关推荐
这个方法首先通过 `owner.getClass()` 得到该对象的 Class,然后通过 `getMethod(methodName, argsClass)` 得到要执行的方法,最后通过 `method.invoke(owner, args)` 执行该方法。 在 Java 反射机制中,我们可以...
Method method = A.class.getMethod("foo", String.class); method.invoke(new A(), "John"); } } ``` Java 中的 Method 对象的 invoke 方法提供了动态调用方法的能力,通过 MethodAccessor 对象来实现实际的方法...
`Invoke.java`可能包含反射调用的逻辑,而`Print.java`则可能用来打印或处理反射调用的结果。 总的来说,Java反射提供了强大的能力,让我们可以在运行时动态地操作类和对象。尽管它增加了程序的复杂性,但在某些...
在`Invoke.java`和`Print.java`这两个文件中,可能包含了具体的示例代码,通过运行这些代码可以更好地理解上述概念。学习和掌握Java反射机制不仅有助于理解Java的内部工作机制,还能为日常开发带来很大的灵活性和...
接着,使用`getMethod(String methodName, Class<?>... parameterTypes)`找到对应的方法,最后通过`Method`对象的`invoke(Object obj, Object... args)`执行方法,其中`obj`是目标对象,`args`是传递给方法的实际...
Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class); method.invoke(mActivityManager, packageName); //packageName是需要强制停止的应用程序包名
Method method = ActivityThread.class.getMethod("currentActivityThread"); Object activityThread = method.invoke(null); method = activityThread.getClass().getMethod("getWindowManager"); Object ...
System.Reflection.MethodInfo mi = t.GetMethod(methodname); //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了,method....
在上面的代码中,首先通过 `owner.getClass()` 获取对象的 Class,然后配置参数的 Class 数组,接着通过 `ownerClass.getMethod(methodName, argsClass)` 获取该对象的方法,最后通过 `method.invoke(owner, args)` ...
try { Method m1 = department.getClass().getMethod("getEmployees"); Employee employees = (Employee[]) m1.invoke(department); for (Employee employee : employees) { Method m2 = employee.getClass()....
Method method=clazz.getMethod(“方法名”, 参数类型的 Class 对象); //调用方法,无返回值 method.invoke(obj, 参数); //调用方法,有返回值 Method method=clazz.getDeclaredMethod(“方法名”, 参数类型的 ...
通过`getMethod(methodName, args.getClasses())`获取对应的方法,并使用`method.invoke(owner, args)`执行该方法。 4. **调用静态方法** ```java public Object invokeStaticMethod(String className, String ...
Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。 method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数...
MethodInfo method = type.GetMethod(methodName); object[] parameters = new object[] { param }; // 创建实例;调用方法(传递参数,获取返回值) object instance = assembly.CreateInstance(type.ToString()...
Method method = ownerClass.getMethod(methodName, getParameterTypes(args)); return method.invoke(owner, args); } private Class[] getParameterTypes(Object[] args) { Class[] types = new Class[args....
- `Method method = ownerClass.getMethod(methodName, argsClass);` 通过方法名和参数类型获取方法对象。 - `method.invoke(owner, args);` 调用方法,并传入对象和参数。 ##### 3.4 执行某个类的静态方法 ```...
首先通过`owner.getClass()`获取对象的类,然后使用`getMethod`方法获取对应的方法签名,接着通过`method.invoke`执行该方法。 ##### 4. 调用静态方法 ```java public Object invokeStaticMethod(String className...
invoke(this, OldInterface.class.getMethod("oldMethod"), null); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getDeclaringClass()....
MethodInfo genericMethod = myType.GetMethod("GenericMethod", BindingFlags.Public | BindingFlags.Instance) .MakeGenericMethod(genericParamType); genericMethod.Invoke(instance, new object[] { ...
System.Reflection.MethodInfo method = type.GetMethod("WriteString"); string s = (string)method.Invoke(obj, new string[]{"jianglijun"}); ``` #### 二、反射的应用场景 反射在C#中有广泛的应用,包括但不...