精华内容
下载资源
问答
  • 反射Add方法调用失败 手机型号:OnePlus3 手机系统版本:如:Android 8.0 <p>Robust版本:0.4.78 <p>Gradle版本:3.3 系统:Mac 堆栈/日志: <pre><code>java 04-11 10:13:34....
  • 两个apk之间的通信,通过service和反射技术,多个apk也不是问题
  • 我们可以将接口调用放在JNI层,通过反射调用所需接口,之后打包成.so库,这样既可对外隐藏所有调用细节。下面开始讲解JNI怎么调用Java方法。 首先模拟实现一个类,代表想隐藏的接口 代码如下:   package ...

    Android开发中一般讲Java接口调用放在APP层,但是如果想对外隐藏Java接口调用,应该怎么办呢?我们可以将接口调用放在JNI层,通过反射调用所需接口,之后打包成.so库,这样既可对外隐藏所有调用细节。下面开始讲解JNI怎么调用Java方法。
    首先模拟实现一个类,代表想隐藏的接口

    代码如下:
     

    package com.lb6905.jnidemo; 
    import android.util.Log; 
    
    public class TestClass { 
        private final static String TAG = "TestClass"; 
        public TestClass(){ 
        Log.i(TAG, "TestClass"); 
        } 
    
        public void test(int index) { 
        Log.i(TAG, "test : " + index); 
        } 
    
        public static void testStatic(String str) { 
        Log.i(TAG, "testStatic : " + str); 
        } 
    
        public static class InnerClass { 
            private int num; 
    
            public InnerClass() { 
            Log.i(TAG, "InnerClass"); 
            } 
    
            public void setInt(int n) { 
                num = n; 
                Log.i(TAG, "setInt: num = " + num); 
            } 
        } 
    }
    

    这个类包一个构造方法、一个成员方法,一个静态方法,一个内部类,大多数的类都是由这三种方法组成的。下面要做的就是怎么在JNI调用这些方法。
    查看方法签名

    这里首先Make Project,否则不会生成Java文件对应的class文件

    进入到classpath目录下:
    命令: cd app/build/intermediates/classes/debug

    查看外部类的签名
    javap -s -p com.lb6905.jnidemo.TestClass

    查看内部类的签名
    javap -s -p com.lb6905.jnidemo.TestClass$InnerClass

    结果如下:
     

        F:\Apps\jniDemo\JNIDemo\app\build\intermediates\classes\debug>javap -s -p com.lb6905.jnidemo.TestClass
        Compiled from "TestClass.java"
    
        public class com.lb6905.jnidemo.TestClass
    
        {
            private static final java.lang.String TAG;
            descriptor:
            Ljava / lang / String; public com.lb6905.jnidemo.TestClass();
            descriptor:
            () V public void test ( int);
            descriptor:
            (I) V public static void testStatic (java.lang.String);
            descriptor:
            (Ljava / lang / String;)V
        }
    
        F:\Apps\jniDemo\JNIDemo\app\build\intermediates\classes\debug>javap -s -p com.lb6905.jnidemo.TestClass$InnerClass 
         Compiled from "TestClass.java"
    
        public class com.lb6905.jnidemo.TestClass$InnerClass
    
        {
            private int num;
            descriptor:
            I public com.lb6905.jnidemo.TestClass$InnerClass();
            descriptor:
            () V public void setInt ( int);
            descriptor:
            (I) V
        }

    在JNI中反射调用上述方法

        注意:①. 在反射类时,使用(*env)->FindClass(env, "包名/类名");

                        若使用(*env)->GetObjectClass(env, clazz); , 有时获取不到方法名

                   ②. 若回调java中非静态方法,调用(*env)->CallVoidMethod(); 之前需要根据构造方法实例化类对象

        JNIEXPORT void JNICALL Java_com_lb6905_jnidemo_MainActivity_JNIReflect(JNIEnv *env, jobject thiz) { 
            //实例化Test类 
            jclass testclass = (*env)->FindClass(env, "com/lb6905/jnidemo/TestClass");
            
            //构造函数的方法名为<init> 
            jmethodID testcontruct = (*env)->GetMethodID(env, testclass, "<init>", "()V"); 
            
            //根据构造函数实例化对象 
            jobject testobject = (*env)->NewObject(env, testclass, testcontruct); 
            
            //调用成员方法,需使用jobject对象 
            jmethodID test = (*env)->GetMethodID(env, testclass, "test", "(I)V"); 
            (*env)->CallVoidMethod(env, testobject, test, 1); 
            
            //调用静态方法 
            jmethodID testStatic = (*env)->GetStaticMethodID(env, testclass, "testStatic", "(Ljava/lang/String;)V"); 
            
            //创建字符串,不能在CallStaticVoidMethod中直接使用"hello world!",会报错的 
            jstring str = (*env)->NewStringUTF(env, "hello world!"); 
            
            // 调用静态方法使用的是jclass,而不是jobject 
            (*env)->CallStaticVoidMethod(env, testclass, testStatic, str); 
            
            // 实例化InnerClass子类 
            jclass innerclass = (*env)->FindClass(env, "com/lb6905/jnidemo/TestClass$InnerClass"); 
            jmethodID innercontruct = (*env)->GetMethodID(env, innerclass, "<init>", "()V"); 
            jobject innerobject = (*env)->NewObject(env, innerclass, innercontruct); 
            
            // 调用子类的成员方法 
            jmethodID setInt = (*env)->GetMethodID(env, innerclass, "setInt", "(I)V"); 
            (*env)->CallVoidMethod(env, innerobject, setInt, 2); 
        }

     

    参考于:https://blog.csdn.net/lb377463323/article/details/75303125

    展开全文
  • ActivityManager sd = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);...Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class); method.invok
    ActivityManager sd = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);
    method.invoke(sd, "com.h3c.ServiceAuto");
    展开全文
  • 反射调用方法时,我们需要通过传入方法调用对象以及方法的实参,在参数有数组类型时,则会存在一定问题,看如下示例: public static void print(String... s){ for (String str : s){ System.out.println...

    在反射调用方法时,我们需要通过传入方法调用对象以及方法的实参,在参数有数组类型时,则会存在一定问题,看如下示例:

    public static void print(String... s){
            for (String str : s){
                System.out.println(str);
            }
    }

    以上方法为App类中的一个静态方法,其通过不定参数的形式定义字符串数组形参,当我们采用一般方式进行反射调用时:
    Method method = App.class.getMethod("print",String[].class);
    method.invoke(null, new String[]{"aaa","bbb","ccc"});
    则会产生如下错误:
    Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at com.hik.App.main(App.java:18)
    正确的调用方式如下
    Method method = App.class.getMethod("print",String[].class);
    method.invoke(null, (Object) new String[]{"aaa","bbb","ccc"});
    或者采用如下方式:
    Method method = App.class.getMethod("print",String[].class);
    method.invoke(null,  new Object[]{new String[]{"aaa","bbb","ccc"}});




    
    
    
    
    
    

    展开全文
  • C#反射调用类中的私有方法

    千次阅读 2019-08-19 14:19:41
    很所时候,我们在看API的时候,某个类中有个很好的方法,但是是私有的,我们没办法直接用,在这里给大家提供一个采用反射方法调用类中私有方法的示例: Type type = app.GetType(); BindingFlags flags = ...

      很所时候,我们在看API的时候,某个类中有个很好的方法,但是是私有的,我们没办法直接用,在这里给大家提供一个采用反射的方法去调用类中私有方法的示例:

                Type type = app.GetType();
                BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;
                var m = type.GetMethod("privateMethodName", flags);
                var obj = m.Invoke(app, null);

          示例代码中app为类对象,getMethod方法的第一个参数为私有方法的方法名称。调用invoke方法的第二个参数为该私有方法的参数。可用以上方法简单的调用类中的私有方法。
     ———————————————— 
    版权声明:本文为CSDN博主「9527-早」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/mazhuo110/article/details/81530851

    展开全文
  • 如果知道方法名 class.getDeclaredMethod(String, Class...) 如果不知道方法名可以获取所有的Method class.getDeclaredMethods()然后使用invoke方法,将方法注入到class中调用具体事例代码如下import java.lang....
  • android 反射调用其他apk中的方法

    千次阅读 2016-10-08 13:12:16
    最近在研究调用Android原生界面进行拍照,尝试了很多方法均没有成功,刚开始想到了采用模拟按键的方式去实现,发现不可行,用Instrumentation 需要是system app,不能当做普通app,如果手机已被Root,采用...
  • 使用反射调用android API中的hide方法

    千次阅读 2018-08-20 10:23:55
    在进行Android项目开发过程中,有很多公开的api方法可以直接调用,但是还有一部分api方法是hide的,如下所示: android/app/PendingIntent.java: /** * @hide * Return the Intent of this PendingIntent. */...
  • 通过反射机制调用系统隐藏的API清除手机所有的app缓存.关键方法freeStorageAndNotify。前提添加AIDL文件.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • try { Method m1=Class.forName("app1.Myapp1.Worker1").getMethod...//静态方法不需要实例化 可以直接调用执行 但是这个类名必须包括包名 等 不然报错 Class c=Class.forName("app1.Myapp1.Worker1"); ...
  • package com.web.app.listener.util; import org.apache.catalina.loader.WebappClassLoader; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import jav
  • 我把一个程序打成jar包,如app.jar 改jar包中的一个方法通过反射调用了另一个jar包中的main方法。我用以下参数运行: java -jar app.jar "the_mainclass_to_call_by_reflection" -class-path . 得到异常:java...
  • 两种android app调用jar的方法

    千次阅读 2017-01-19 09:43:16
    正苦闷用什么打包方式,要是使用jar打包,jar只能打包class文件,要想把资源文件打包进去比较麻烦的意见事情,界面不多的话可以使用反射调用,把资源文件都通过这个反射的R引用出来。String packageName = context....
  • Android-反射调用隐藏API

    千次阅读 2013-11-02 12:18:07
    android中有些时候我们在写代码时无法直接调用隐藏的API,这就需要用发射的方法来获得。下面通过一个java文件展示一个如何调用隐藏API的例子: package com.sonyericsson.tetheringdemo; import android.app....
  • //加载程序集(dll文件...Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Bin/App_Code.dll"); //获取类型,参数(名称空间+类) Type type = assembly.GetType("assembl...
  • package com.ieslab.wechatapp.util; import com.ieslab.wechatapp.powerbalance.entity.PowerGenerationData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; ...
  • MainActivity如下: ... import java.lang.reflect.Field; import java.lang.reflect.Method; import android.os.Bundle;...import android.app.Activity; /** * Demo描述: * 在一个类中有另外一个类的对象 * 比如此
  • 枚举自定义实体 var assembly = Assembly.LoadFrom(string.Format("{0}Blackice.App.Model.dll", BaseConfig.BinnPath)); var types = assembly.GetTypes(); foreach (var t in t...
  • DOCTYPE web-app SYSTEM "../lib/web-app_2_3.dtd" > <web-app version="2.3"> <servlet> <servlet-name>MyServlet1</servlet-name> <servlet-class>com.dxm.servlet.My.
  • 因为项目用到了模块化,library中调用app类中的方法只能通过反射 这里是app中的类,startAction方法需要接收从library传过来的值 public class ManuscriptDetailActivity extends BaseActivity { //将数据传...
  • 比如设置Contrast(对比度),Sharpness(清晰度),Saturation(饱和度)等等的一下方法,这些方法在谷歌原生的api中是没有的,在实际开发中想要使用这些方法就要利用Java的反射机制,获取到相应的使用方法。...
  • 本文通过一段代码给大家介绍android获取app应用程序大小的方法,由于android对这种方法进行了封装,我们没有权限去调用这个方法,只能通过aidl,然后用java的反射机制去调用系统级方法,感兴趣的朋友一起学习吧
  • Android Jni反射Java方法,弹出对话框

    千次阅读 2016-06-09 11:36:03
    1、创建页面/** * @描述 C语言调用java反射方法 * @项目名称 App_imooc * @包名 com.android.imooc.jni * @类名 ReflectActivity * @author chenlin * @date 2012年6月9日 上午8:49:35 */public
  • 也可以用java的反射调用其他APP中的方法。但是你需要知道其他APP得包名,类名,或获取他的JNI文件。    通过制作SDK(即是一个jar包),在其他项目中,只要导入这个jar包,就可以很快捷的使用sdk中的方法调用...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 204
精华内容 81
关键字:

反射调用app方法