`

getMethod method.invoke

    博客分类:
  • java
阅读更多

JAVA反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
1. 得到某个对象的属性

Java代码  
  1. public Object getProperty(Object owner, String fieldName) throws Exception {   
  2.      Class ownerClass = owner.getClass();   
  3.     
  4.      Field field = ownerClass.getField(fieldName);   
  5.     
  6.      Object property = field.get(owner);   
  7.     
  8.      return property;   
  9. }  
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. 得到某个类的静态属性

Java代码 复制代码 收藏代码
  1. public Object getStaticProperty(String className, String fieldName)   
  2.              throws Exception {   
  3.      Class ownerClass = Class.forName(className);   
  4.     
  5.      Field field = ownerClass.getField(fieldName);   
  6.     
  7.      Object property = field.get(ownerClass);   
  8.     
  9.      return property;   
  10. }  
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. 执行某对象的方法

Java代码 复制代码 收藏代码
  1. public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {   
  2.     
  3.      Class ownerClass = owner.getClass();   
  4.     
  5.      Class[] argsClass = new Class[args.length];   
  6.     
  7.      for (int i = 0, j = args.length; i < j; i++) {   
  8.          argsClass[i] = args[i].getClass();   
  9.      }   
  10.   
  11.       Method method = ownerClass.getMethod(methodName,argsClass);   
  12.     
  13.      return method.invoke(owner, args);   
  14. }  
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. 执行某个类的静态方法

Java代码 复制代码 收藏代码
  1. public Object invokeStaticMethod(String className, String methodName,   
  2.              Object[] args) throws Exception {   
  3.      Class ownerClass = Class.forName(className);   
  4.     
  5.      Class[] argsClass = new Class[args.length];   
  6.     
  7.      for (int i = 0, j = args.length; i < j; i++) {   
  8.          argsClass[i] = args[i].getClass();   
  9.      }   
  10.     
  11.     Method method = ownerClass.getMethod(methodName,argsClass);   
  12.     
  13.      return method.invoke(null, args);   
  14.  }  
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. 新建实例

Java代码 复制代码 收藏代码
  1. public Object newInstance(String className, Object[] args) throws Exception {   
  2.      Class newoneClass = Class.forName(className);   
  3.     
  4.      Class[] argsClass = new Class[args.length];   
  5.     
  6.      for (int i = 0, j = args.length; i < j; i++) {   
  7.          argsClass[i] = args[i].getClass();   
  8.      }   
  9.     
  10.      Constructor cons = newoneClass.getConstructor(argsClass);   
  11.     
  12.      return cons.newInstance(args);   
  13.     
  14. }  
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. 判断是否为某个类的实例

Java代码 复制代码 收藏代码
  1. public boolean isInstance(Object obj, Class cls) {   
  2.      return cls.isInstance(obj);   
  3. }  
public boolean isInstance(Object obj, Class cls) {
     return cls.isInstance(obj);
}

 
7. 得到数组中的某个元素

Java代码 复制代码 收藏代码
  1. public Object getByArray(Object array, int index) {   
  2.      return Array.get(array,index);   
  3. }  
分享到:
评论

相关推荐

    java反射机制及Method.invoke解释

    这个方法首先通过 `owner.getClass()` 得到该对象的 Class,然后通过 `getMethod(methodName, argsClass)` 得到要执行的方法,最后通过 `method.invoke(owner, args)` 执行该方法。 在 Java 反射机制中,我们可以...

    详解Java中Method的Invoke方法

    Method method = A.class.getMethod("foo", String.class); method.invoke(new A(), "John"); } } ``` Java 中的 Method 对象的 invoke 方法提供了动态调用方法的能力,通过 MethodAccessor 对象来实现实际的方法...

    Java方法反射调用demo

    `Invoke.java`可能包含反射调用的逻辑,而`Print.java`则可能用来打印或处理反射调用的结果。 总的来说,Java反射提供了强大的能力,让我们可以在运行时动态地操作类和对象。尽管它增加了程序的复杂性,但在某些...

    Java反射方法调用

    在`Invoke.java`和`Print.java`这两个文件中,可能包含了具体的示例代码,通过运行这些代码可以更好地理解上述概念。学习和掌握Java反射机制不仅有助于理解Java的内部工作机制,还能为日常开发带来很大的灵活性和...

    Java反射机制及Method.invoke详解

    接着,使用`getMethod(String methodName, Class&lt;?&gt;... parameterTypes)`找到对应的方法,最后通过`Method`对象的`invoke(Object obj, Object... args)`执行方法,其中`obj`是目标对象,`args`是传递给方法的实际...

    KillRunApkApplication.rar

    Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class); method.invoke(mActivityManager, packageName); //packageName是需要强制停止的应用程序包名

    Android Home键拦截

    Method method = ActivityThread.class.getMethod("currentActivityThread"); Object activityThread = method.invoke(null); method = activityThread.getClass().getMethod("getWindowManager"); Object ...

    WebService.cs

    System.Reflection.MethodInfo mi = t.GetMethod(methodname); //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了,method....

    JAVA基础--JAVA中的反射机制详解

    在上面的代码中,首先通过 `owner.getClass()` 获取对象的 Class,然后配置参数的 Class 数组,接着通过 `ownerClass.getMethod(methodName, argsClass)` 获取该对象的方法,最后通过 `method.invoke(owner, args)` ...

    Java反射封装库joor.zip

    try { Method m1 = department.getClass().getMethod("getEmployees"); Employee employees = (Employee[]) m1.invoke(department); for (Employee employee : employees) { Method m2 = employee.getClass()....

    Java反射技术栈1

    Method method=clazz.getMethod(“方法名”, 参数类型的 Class 对象); //调用方法,无返回值 method.invoke(obj, 参数); //调用方法,有返回值 Method method=clazz.getDeclaredMethod(“方法名”, 参数类型的 ...

    JAVA反射机制详解

    通过`getMethod(methodName, args.getClasses())`获取对应的方法,并使用`method.invoke(owner, args)`执行该方法。 4. **调用静态方法** ```java public Object invokeStaticMethod(String className, String ...

    Java 反射(Reflection) 经典实用例子

    Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。 method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数...

    c# 反射实例

    MethodInfo method = type.GetMethod(methodName); object[] parameters = new object[] { param }; // 创建实例;调用方法(传递参数,获取返回值) object instance = assembly.CreateInstance(type.ToString()...

    Java中的反射机制

    Method method = ownerClass.getMethod(methodName, getParameterTypes(args)); return method.invoke(owner, args); } private Class[] getParameterTypes(Object[] args) { Class[] types = new Class[args....

    Java反射经典实例 Java Reflection Cookbook[1].pdf

    - `Method method = ownerClass.getMethod(methodName, argsClass);` 通过方法名和参数类型获取方法对象。 - `method.invoke(owner, args);` 调用方法,并传入对象和参数。 ##### 3.4 执行某个类的静态方法 ```...

    反射机制.txt

    首先通过`owner.getClass()`获取对象的类,然后使用`getMethod`方法获取对应的方法签名,接着通过`method.invoke`执行该方法。 ##### 4. 调用静态方法 ```java public Object invokeStaticMethod(String className...

    Java动态代理1

    invoke(this, OldInterface.class.getMethod("oldMethod"), null); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getDeclaringClass()....

    C# 加载Dll 使用反射 调用对应的方法公开方法,私有方法,泛型方法

    MethodInfo genericMethod = myType.GetMethod("GenericMethod", BindingFlags.Public | BindingFlags.Instance) .MakeGenericMethod(genericParamType); genericMethod.Invoke(instance, new object[] { ...

    关于C#反射使用笔记

    System.Reflection.MethodInfo method = type.GetMethod("WriteString"); string s = (string)method.Invoke(obj, new string[]{"jianglijun"}); ``` #### 二、反射的应用场景 反射在C#中有广泛的应用,包括但不...

Global site tag (gtag.js) - Google Analytics