精华内容
下载资源
问答
  • 内容简介主要介绍使用反射的机制来调用执行类中的静态方法。静态方法public class GisUtil {private final static Logger logger = LoggerFactory.getLogger(GisUtil.class);public static ExportMethodResultDto ...

    内容简介

    主要介绍使用反射的机制来调用执行类中的静态方法。

    静态方法

    public class GisUtil {

    private final static Logger logger = LoggerFactory.getLogger(GisUtil.class);

    public static ExportMethodResultDto gisService1 (String str){

    logger.info("进入gisService1方法,参数[str]:" + str);

    ExportMethodResultDto dto = new ExportMethodResultDto();

    LocalDateTime currentTime = LocalDateTime.now();

    DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    dto.setJobId(df.format(currentTime));

    dto.setOutFilePath("E:\\DocDirectory\\test.doc");

    return dto;

    }

    public static ExportMethodResultDto gisService2 (ExportProjectRasterParam param){

    logger.info("进入gisService2方法...");

    logger.info("参数[param]=" + param);

    ExportMethodResultDto dto = new ExportMethodResultDto();

    String uuId = StrUtil.getUUID();

    dto.setJobId(uuId);

    dto.setOutFilePath("E:\\"+ uuId +"\\srtm_49_02_raster.shp");

    return dto;

    }

    }

    调用

    String str = "test_service_1";

    Class> threadClazz = Class.forName("com.lgt.demo2.gisService.util.GisUtil");

    Method method = threadClazz.getMethod("gisService1", String.class);

    ExportMethodResultDto dto = (ExportMethodResultDto)method.invoke(null, str);

    logger.info("gisService1返回:");

    logger.info(" jobId:"+ dto.getJobId());

    logger.info(" OutFilePath:" + dto.getOutFilePath());

    ExportProjectRasterParam param = new ExportProjectRasterParam();

    param.setCellSize("1");

    param.setResamplingType("NEAREST");

    param.setInCoorSystem("GCS_WGS_1984");

    param.setOutCoorSystem("GCS_China_Geodetic_Coordinate_System_2000");

    Method method2 = threadClazz.getMethod("gisService2", ExportProjectRasterParam.class);

    ExportMethodResultDto dto2 = (ExportMethodResultDto)method2.invoke(null,param);

    logger.info("gisService2返回:");

    logger.info(" jobId:"+ dto2.getJobId());

    logger.info(" OutFilePath:" + dto2.getOutFilePath());

    输出结果

    2019-07-03 14:51:08.816 INFO 332 --- [nio-8080-exec-2] com.lgt.demo2.gisService.util.GisUtil : 进入gisService1方法,参数[str]:test_service_1

    2019-07-03 14:51:08.852 INFO 332 --- [nio-8080-exec-2] c.l.d.f.controller.StringController : gisService1返回:

    2019-07-03 14:51:08.853 INFO 332 --- [nio-8080-exec-2] c.l.d.f.controller.StringController : jobId:2019-07-03 14:51:08

    2019-07-03 14:51:08.853 INFO 332 --- [nio-8080-exec-2] c.l.d.f.controller.StringController : OutFilePath:E:\DocDirectory\test.doc

    2019-07-03 14:51:08.853 INFO 332 --- [nio-8080-exec-2] com.lgt.demo2.gisService.util.GisUtil : 进入gisService2方法...

    2019-07-03 14:51:08.854 INFO 332 --- [nio-8080-exec-2] com.lgt.demo2.gisService.util.GisUtil : 参数[param]=[inCoorSystem:GCS_WGS_1984,outCoorSystem:GCS_China_Geodetic_Coordinate_System_2000,resamplingType:NEAREST,cellSize:1]

    2019-07-03 14:51:08.858 INFO 332 --- [nio-8080-exec-2] c.l.d.f.controller.StringController : gisService2返回:

    2019-07-03 14:51:08.859 INFO 332 --- [nio-8080-exec-2] c.l.d.f.controller.StringController : jobId:79b4e82ef4564855881ecb4030ba39e2

    2019-07-03 14:51:08.859 INFO 332 --- [nio-8080-exec-2] c.l.d.f.controller.StringController : OutFilePath:E:\79b4e82ef4564855881ecb4030ba39e2\srtm_49_02_raster.shp

    用到的实体类

    public class ExportMethodResultDto implements Serializable {

    private String outFilePath;//生成文件的绝对路径

    private String jobId;//GIS调用异步服务响应的jobId

    public String getOutFilePath() {

    return outFilePath;

    }

    public void setOutFilePath(String outFilePath) {

    this.outFilePath = outFilePath;

    }

    public String getJobId() {

    return jobId;

    }

    public void setJobId(String jobId) {

    this.jobId = jobId;

    }

    }

    ExportMethodResultDto

    public class ExportProjectRasterParam implements Serializable {

    private String inCoorSystem;//输入坐标系

    private String outCoorSystem;//输出坐标系

    private String resamplingType;//重采样算法(可选)

    private String cellSize;//像元大小(可选)

    public String getInCoorSystem() {

    return inCoorSystem;

    }

    public void setInCoorSystem(String inCoorSystem) {

    this.inCoorSystem = inCoorSystem;

    }

    public String getOutCoorSystem() {

    return outCoorSystem;

    }

    public void setOutCoorSystem(String outCoorSystem) {

    this.outCoorSystem = outCoorSystem;

    }

    public String getResamplingType() {

    return resamplingType;

    }

    public void setResamplingType(String resamplingType) {

    this.resamplingType = resamplingType;

    }

    public String getCellSize() {

    return cellSize;

    }

    public void setCellSize(String cellSize) {

    this.cellSize = cellSize;

    }

    public String toString(){

    return String.format("[inCoorSystem:%s,outCoorSystem:%s,resamplingType:%s,cellSize:%s]",this.inCoorSystem,this.outCoorSystem,this.resamplingType,this.cellSize);

    }

    }

    ExportProjectRasterParam

    java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

    java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

    【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

    利用反射--调用一个按钮的Click事件

    最基本的调用方法 (1)button1.PerformClick();(2)button1_Click(null,null);(3)button_Click(null,new EventArgs()) ...

    java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap

    C#利用反射调用PB编译的COM组件

    问题: 1.根据COM组件的ProgID,得到COM组件公开的类型 2.创建COM组件提供的类型的对象 3.调用执行方法 正确姿势 C#利用反射调用(后期绑定)PB编译的COM组件 C#调用COM组件 ...

    Java中如何调用静态方法

    Java中如何调用静态方法: 1.如果想要调用的静态方法在本类中,可直接使用方法名调用 2.调用其他类的静态方法,可使用类名.方法名调用 关于静态方法能被什么调用 1.实例方法 2.静态发放

    【Java】反射调用与面向对象结合使用产生的惊艳

    缘起 我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用. 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑 ...

    java 利用jna调用c#的dll

    一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...

    随机推荐

    Hello Java

    用记事本或者Eclipse编写如下代码 public class JavaAPP{       public static void main(String[] args){       System ...

    Unity3d 解析文本执行已注册的自定函数

    最近有个需求是想让程序解析策划编辑一个文本生成一段CG,内容使用大致是这样 cgSetCameraEx(118.6324,30.71189,75.55666,45,-45,0,0) cgCloneMy ...

    Solr auto commit 配置

    为了解决写索引时频繁提交带来的效率问题,考虑使用自动提交. 在solrconfig.xml中增加以下代码:

    linux下神奇的script命令

    script 是一个神奇命令,script 能够将终端的会话过程录制下来,然后使用 scriptreplay 就可以将其录制的结果播放给他人观看.script 的好处就在于你在终端中的所有操作.敲过的 ...

    vs2013调试崩溃,重启电脑依旧崩溃

    如果大家遇到 VS断点调试程序崩溃的问题,可以排查是不是有这个问题 VSx新安装了插件 点击工具---扩展和更新  禁用最新安装的程序 一般就没有问题了

    hdu4352 数位dp+状态压缩+一个tip

    按照nlogn求lis的方法,把lis的状态压缩了,每次新加一个数就把它右边第一个数的位置置为0,然后把这个数加进去 一个需要注意的地方,如果前面都是0,那么状态s中代表0的位置不可以是1,因为这种情 ...

    HTML5开发之meta标签的viewport使用说明

    随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而每一款手机有不同的分辨率,不同屏幕大 ...

    luogu 1314 聪明的质检员

    二分答案的边界问题还是要注意 double挨着,int+1-1, 此题用到long long,所以初始化ans要足够大,前缀和优化 依然根据check答案大小左右mid,虽然有s,但是有了+1-1加持 ...

    展开全文
  • 最近在研究调用android原生界面进行拍照,尝试了很多方法均没有成功,刚开始想到了采用模拟按键的方式去实现,发现不可行,用Instrumentation 需要是system app,不能当做普通app,如果手机已被Root,采用...

    最近在研究调用android原生界面进行拍照,尝试了很多方法均没有成功,刚开始想到了采用模拟按键的方式去实现,发现不可行,用Instrumentation 需要是system app,不能当做普通app,如果手机已被Root,采用Instrumentation 模拟KEYCODE_CAMERA按键的方式倒是可行的。在非Root设备上,是因为权限的问题而报错,想到采用JNI的方式,尝试发现还是不能绕开android系统的权限问题,也是不可行的,后面想到反射,尝试发现也是不可行的,因为有很多参数需要初始化,之前很少用到反射,现在记录下使用反射的过程。

    1. 在使用反射的过程中,被第一个问题困扰,找不到com.android.camera这个包名,后面通过反编译发现这个包被打进了com.android.gallery3d这个包,也就是说,它把Camera和Gallery合成了一个apk,了解了这个问题以后就好办了。

    2. 主要代码

    Context mmsCtx = createPackageContext("com.android.gallery3d",

    Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);

    Class> clazz = Class.forName("com.android.camera.manager.ShutterManager", true, mmsCtx.getClassLoader());

    Constructor>[] constructors = clazz.getDeclaredConstructors();

    Constructor> constructor = null;

    for (int i = 0; i < constructors.length; i++) {

    constructor = constructors[i];

    if (constructor.getGenericParameterTypes().length == 0)

    break;

    }

    constructor.setAccessible(true);

    Class> camera = Class.forName("com.android.camera.Camera", true, mmsCtx.getClassLoader());

    Object cameraObject = camera.newInstance();

    Object maObject = constructor.newInstance(cameraObject);

    Method[] methods = clazz.getMethods();

    Method[] methodss = clazz.getDeclaredMethods();

    for(Method meth : methodss) {

    Log.i(TAG,"name:" + meth.getName());

    /*if(meth.getName().equals("getView")) {

    meth.setAccessible(true);

    meth.invoke(maObject);

    }*/

    }

    for(Method meth : methods) {

    //Log.i(TAG,"name:" + meth.getName());

    if(meth.getName().equals("performPhotoShutter")) {

    meth.setAccessible(true);

    meth.invoke(maObject);

    }

    }

    这里面主要要注意的地方就是:

    1. 因为这个相机apk比较特殊,他不是在com.android.camera这个包里,首先要找到包名:createPackageContext(com.android.gallery3d), 然后在查找类的时候,就不需要

    外面的这层包名,直接用它的包名和类名就可以了:com.android.camera.manager.ShutterManager,如果还是加上外面层的包名会出现找不到类的异常。

    2. 实例化类,通过newInstance 可以实现,而且可以传递参数,如上面就是constructor.newInstance(cameraObject); 给 ShutterManager 传递了 Camera 这个参数

    3. getDeclaredMethods() 和 getMethods() 获取到的函数数组还是不一样的。

    最后通过log发现com.android.camera.manager.ShutterManager 里的 performPhotoShutter()确实被调用了,但是因为该方法里有数据没有初始化,所以还是不能拍照的。

    反射机制确实很强大。

    展开全文
  • c/c++反射调用JAVA方法

    2021-09-23 14:11:25
    c/c++调用JAVA方法 与 java通过反射调用JAVA方法 原理一样。java通过类、方法名、参数 来唯一确定一个方法。 1.通过包名找到Java中的类名 2.获取java类中方法id:参数一为类对象,参数二为java中方法名,参数三为...
            c/c++调用JAVA方法 与 java通过反射调用JAVA方法 原理一样。java通过类、方法名、参数 来唯一确定一个方法。
    1.通过包名找到Java中的类名
    2.获取java类中方法id:参数一为类对象,参数二为java中方法名,参数三为方法唯一签名
    3.执行调用
    

    先看java通过反射调用JAVA方法

    public class Jk {
         public void p(String s) {
              System. out.println(s);
         }
    }
    
    
    
    //另一个Test类来反射此类,执行p(String)方法
    public class Test {
         public static void main(String[] args) {
               try {
                  Class clazz = Test.class.getClassLoader().loadClass("Jk" );
                  Method method = clazz.getDeclaredMethod("p" ,new Class[] { String.class });
                  method.invoke(clazz.newInstance(), new String[] { "java反射" });
              } catch (Exception e) {
                  e.printStackTrace();
              }
         }
    }

     加入JDK路径到Path :C:\Program Files\Android\Android Studio\jre\bin

    cd C:\Users\FT\AndroidStudioProjects\SoftPos\app\build\intermediates\javac\debug\classes
    
    javap -s com.ft.softpos.SoftPos

    获得类下面所有方法的签名 

    C:\Users\FT\AndroidStudioProjects\SoftPos\app\build\intermediates\javac\debug\classes>javap -s com.ft.softpos.SoftPos
    Compiled from "SoftPos.java"
    public class com.ft.softpos.SoftPos {
      public static java.lang.String className;
        descriptor: Ljava/lang/String;
      public com.ft.softpos.SoftPos();
        descriptor: ()V
    
      public java.lang.Short halWaitCard(java.lang.Short, java.lang.Byte[], java.lang.Byte[], java.lang.Byte[]);
        descriptor: (Ljava/lang/Short;[Ljava/lang/Byte;[Ljava/lang/Byte;[Ljava/lang/Byte;)Ljava/lang/Short;
    
      public java.lang.Short halSendApdu(java.lang.Byte, java.lang.Byte[], java.lang.Byte[], java.lang.Short, java.lang.Byte[], java.lang.Byte[], java.lang.Byte[], java.lang.Byte);
        descriptor: (Ljava/lang/Byte;[Ljava/lang/Byte;[Ljava/lang/Byte;Ljava/lang/Short;[Ljava/lang/Byte;[Ljava/lang/Byte;[Ljava/lang/Byte;Ljava/lang/Byte;)Ljava/lang/Short;
    
      public java.lang.Short halRFCardClose();
        descriptor: ()Ljava/lang/Short;
    
      public native void test();
        descriptor: ()V
    
      static {};
        descriptor: ()V
    }
    
    C:\Users\FT\AndroidStudioProjects\SoftPos\app\build\intermediates\javac\debug\classes>

    test()是JAVA调用C语言方法,用于测试,在test()方法里回调JAVA方法。 如果参数不对,as会有提示,按提示也能得到参数签名。

    #include <jni.h>
    #include <string>
    
    #include <Android/log.h>
    #define LOG "SoftPos"
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__)
    
    
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_ft_softpos_SoftPos_test(JNIEnv *env, jobject thiz) {
        // TODO: implement test()
        /* 通过包名找到Java中的类名 */
        jclass clazz = env->FindClass("com/ft/softpos/SoftPos");
        if (clazz == 0)
        {
            LOGE("failed to find class SoftPos");
        }
        else
        {
            LOGE("find class SoftPos succeed!");
        }
    
        /* 获取java类中方法id:参数一为类对象,参数二为java中方法名,参数三为方法唯一签名 */
        jmethodID jId = env->GetMethodID(clazz, "halRFCardClose", "()Ljava/lang/Short;");
        if (jId == 0)
        {
            LOGE("failed to find method in java!");
        }
        else
        {
            LOGE("find method succeed!");
        }
    
        /* 调用java中的方法 */
        env->CallObjectMethod(thiz, jId);
    }

    回调成功。 

     

     

    展开全文
  • 在进行Android项目开发过程中,有很多公开的api方法可以直接调用,但是还有一部分api方法是hide的,如下所示:android/app/PendingIntent.java:/*** @hide* Return the Intent of this PendingIntent.*/public ...

    在进行Android项目开发过程中,有很多公开的api方法可以直接调用,但是还有一部分api方法是hide的,如下所示:

    android/app/PendingIntent.java:

    /**

    * @hide

    * Return the Intent of this PendingIntent.

    */

    public Intent getIntent() {

    try {

    return ActivityManager.getService()

    .getIntentForIntentSender(mTarget);

    } catch (RemoteException e) {

    throw e.rethrowFromSystemServer();

    }

    }

    我们是无法通过PendingIntent的实例来get这个方法的,这个时候就需要用到反射,直接上我的代码如下:

    PendingIntent mPendingIntent = entry.contentIntent;

    try {

    Classcls = PendingIntent.class;//首先还是必须得到这个对象的Class。

    Method mGetIntent = cls.getDeclaredMethod("getIntent");//得到执行的method

    mGetIntent.setAccessible(true);//设置访问权限

    //执行该Method.invoke方法的参数是执行这个方法的对象owner,和参数数组args,可以这么理解:owner

    //对象中带有参数args的method方法。返回值是Object,也既是该方法的返回值;

    //注:要调用的方法无参数,则invoke只传owner,不需要args数组,如下:

    Intent mIntent = (Intent) mGetIntent.invoke(mPendingIntent);

    ArrayListmessages = (ArrayList) mIntent.getSerializableExtra(NimIntent.EXTRA_NOTIFY_CONTENT);

    IMMessage mMessage = messages.get(0);

    if(mMessage != null){

    return mMessage;

    }

    } catch (NoSuchMethodException e) {

    e.getStackTrace();

    } catch (IllegalAccessException e){

    e.getStackTrace();

    } catch (InvocationTargetException e){

    e.getStackTrace();

    }

    注意:getIntent是没有参数的,所以invoke方法中只有一个参数:要调用的方法所在的类实例:ower

    有关反射的更详细内容,有兴趣可以查看:

    https://blog.csdn.net/sinat_38259539/article/details/71799078

    展开全文
  • Zuul的安全机制 签名机制,为防止接口数据篡改和重复调用,增加接口参数校验机制,sig签名算法为MD5(appKey+appSecret+timestamp),appKey是分配给客户端的ID,appSecret是分配给客户端的密钥,timestamp为unix...
  • } } } 调用 public void LoadDLLFile() { //C:\Users\source\repos\WpfApp1\App1\bin\Debug\ClassLibrary1.dll //方式1 dll文件名(当前目录) // Assembly assembly = Assembly.Load("ClassLibrary1"); //方式2 完整...
  • 文章目录 一、报错信息 二、解决方案 一、报错信息 在执行反射方法时 , 反射方法后 , 直接调用方法 ; // 获取 View 的 getListenerInfo 方法 Method getListenerInfo = null; try { getListenerInfo = View.class....
  • import java.io.IOException; import java.lang.... 测试环境: tomcat6.0 以上这篇利用java反射机制实现自动调用类的简单方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
  • } } 只有系统级别的应用才能使goToSleep生效,并需要声明权限 android:name="android.permission.DEVICE_POWER" 如果是eng版本的rom , 可以执行 adb remount adb push xxx.apk /system/priv-app/ adb reboot 将apk...
  • java 反射调用支付SDK

    2021-02-12 17:41:43
    但是也可以解决SDK资源不小心没有引入,导致程序调用接口崩溃问题。经过查资料,还是写了一个小Demo,仅供参 考!很早之前写的了,估计移动基地SDK,有变动,不过道理是一样的。仅以移动基地SDK举例。1.移动支付需要...
  • 前言项目中有许多以前调用的API,Android studio提示已经过时,所以打算把过时的API替换掉,但是新的API是@hide的,需要反射调用,于是便重温了一下反射机制。先上例子:wifi遗忘功能以前的实现方式是:...
  • 我做的是电话黑名单的拦截,但是在调用endcall方法的时候是不行的,servicemanager对android开发者隐藏,所以不能直接调方法,要用反射的机制。// ITelephony.Stub.asInterface(ServiceManager.getService(Context....
  • Android 中反射的使用

    2021-05-27 07:43:02
    前言目前在做一个Android...研究了下,把现在项目里的opencv有关的大量so和java也打包成了一个插件用反射调用。这样做的好处显而易见,原本35M的apk安装包分离成了一个主程序和两个插件,主程序只有4M左右。插件...
  • import java.lang.reflect.Field;import java.lang.reflect.Method;import android.os.Bundle;import android.app.Activity;/** * Demo描述: * 在一个类中有另外一个类的对象 * 比如此处的Worker类中...
  • manager是为了sdk诞生的,方便app开发者调用。其实可以直接调用service,如mountservice是没有mountmanager的。 service是在系统起来是就被android系统启动的,而manager是后期有需要时实例化起来的。 Service的...
  • ——蔚前言当我们在xposed进行反射调用的时候,很多时候被HOOK函数并不是static函数,但是我们在调用的时候需要传入该函数的类的实例,那实例我们怎么拿到呢,今天介绍几种办法拿到类的实例。情况一对于单例类,这个...
  • JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下: (参数描述符)返回类型 一个数组int[],就需要表示为这样"[I"。 如果多个数组double[][][]就需要表示为这样 “[[[D”。也就是说每一个...
  • 平时我们的写法是先引用命名空间(dll),然后new一个对象,通过这个对象调用其中的字段或方法,通过反射,我们可以不用添加dll来实现效果。 1.首先我们在C#中创建一个Testdll类 打包dll,内容如下 using Sy.
  • 一、问题:Detected problems with API compatibility(visit g.co/dev/appcompat for more info)二、出现的原因:Android9.0后谷歌限制了开发者调用非官方公开API 方法或接口,也就是说,你用反射直接调用源码就会有...
  • 不要通过反射调用系统API。 规避方案 如果不能根治,可以先屏蔽掉这个弹框。 app初始化时调用下面这个函数即可。 private void closeAndroidPDialog(){ try { Class aClass = Class.forName("android.content.pm....
  • Android P+通过反射调用系统API实现高级功能1. 添加反射库1.1 导包1.2 打开隐藏API 通过反射调用系统API已经不算是什么新鲜事了,不过在Android P之后,Google对隐藏API的限制更加严格,不能再直接通过反射去调用...
  • 通过反射得到插件Activity的实例1.3 获取到插件Activity的实例后通过构造函数将宿主的上下文传递到插件APP1.4 在反射调用插件activity的onCreate方法2.宿主代码package com.lazy.dex;...
  • //Ref:http://blog.csdn.net/sodino/article/details/6215224//利用反射机制调用android@hide的API进行解析publicstaticvoidExtractApkInfoExt(StringapkPath,DownloadTasktask){StringPATH_PackageParser="android....
  • private Method forget;private Method connect_netID;private Method connect_wifiConfig;private Method save;public Compatimpl17() {try {Class ActionListener = Class.forName("android.net.wifi.WifiManager$...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,411
精华内容 21,364
关键字:

反射调用app方法