bunchen 发表于 2014-10-21 18:03:36

(代码流)java映射

java是一种解析语言,java程序是通过java虚拟机解析.class的方式运行起来。因此,java中就存在java映射的概念。
下面介绍如何用java映射创建java对象和调用java对象的方法。
一、首先我们要知道这个java的包名和类名。调用静态方法Class.forName(String)获取Class对象。
二、然后我们要知道要调用的方法的声明。调用Class对象的getMethod获取Method对象。
三、传入参数调用Method对象。这时要调用Method对象的invoke方法。

好,现在上代码:lol
package com.bunchen.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class Test {

        public int func(int a , int b){
                return a+b;
        }
        /**
       * @hide
       */
        public int func(int a){
                return a*a;
        }

        public static void main(String[] args) {
                try {
                        Class cls = Class.forName("com.bunchen.test.Test");
                       
                        Constructor[] cs = cls.getConstructors();
                        System.out.println("###### constructors ######");
                        for(Constructor c : cs){
                                System.out.println(c.toString());
                        }
                        System.out.println("##########################");
                       
                        Method[] mtds = cls.getMethods();
                        System.out.println("###### methods ######");
                        for(Method m : mtds){
                                System.out.println(m.toString());
                        }
                        System.out.println("#####################");
                       
                        Method m1 = cls.getMethod("func", int.class,int.class);
                        Method m2 = cls.getMethod("func",int.class);
                       
                        Object obj = cls.getConstructor().newInstance();
                       
                        int a = 3 ;
                        int b = 5 ;
                       
                        int r1 = (Integer) m1.invoke(obj, a,b);
                       
                        int r2 = (Integer) m2.invoke(obj, b);
                       
                        System.out.println("r1="+r1);
                        System.out.println("r2="+r2);
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}



运行结果:



最后的最后,用这种方法我们就可以调用android隐藏了的api的方法了。:lol

ZZP 发表于 2014-10-21 18:06:56

{:2_31:} 赞一个

暴走的阿Sai 发表于 2014-10-22 09:14:29

这个不错,是用Firefly Android上运行的吗?

bunchen 发表于 2014-10-22 09:25:48

暴走的阿Sai 发表于 2014-10-22 09:14
这个不错,是用Firefly Android上运行的吗?

这是java的特性,java语言都可以。根据这个特性,也可以深刻理解jni中用c代码调用java的方式。
页: [1]
查看完整版本: (代码流)java映射