首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你知道java中静态方法不能直接调用非静态成员吗 ?快来看看吧!

Java中,静态方法为什么不能调用非静态成员? 前言 作者:神的孩子都在歌唱 在 Java 中,静态方法(static 方法)和非静态方法之间的区别是程序员在编程时需要特别注意的一个问题。...尤其是在静态方法中尝试访问非静态成员时,常常会遇到编译错误。 一. 静态方法与非静态成员 在讨论静态方法为什么不能访问非静态成员之前,首先要理解一下什么是静态方法,什么是非静态成员。 1....换句话说,静态方法可以在没有创建对象的情况下调用。静态方法通过类名直接调用,例如 ClassName.methodName()。 2....所以在类的 非静态成员 不存在的时候 静态方法 就已经存在了,此时调用在内存中还不存在的非静态成员,属于非法操作。...ShenChang(); System.out.println(shenChang.shenChangVariable); System.out.println("我是静态方法,可以直接通过类名调用

5200
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    货拉拉 Android 动态资源管理系统原理与实践(下)

    我们只需要在工程的主Application中,直接调用loadSo方法,对so动态资源进行加载。加载完成后,so库就能正常使用了。...调用 so 相关 JNI 方法。 而我们这里,由于so文件不存在于apk当中,而是需要动态下载,所以我们显然不能直接使用系统的System.loadLibrary方法加载so文件。...System.loadLibrary方法时,系统最终会调用到DexPathList类的findLibrary方法,该方法会在nativeLibraryPathElements数组中查找对应的路径,我们将自己的...其他方法调用到我们的SoloadUtil时,我们判断我们的加载系统是否初始化完成 已完成,则调用Relinkder库尝试加载so文件,未完成则将该so库加入待加载队列中。...如果该方法的名称,参数列表和调用者,都和System.loadLibrary方法相符合。 我们替换为自己的SoloadUtil.loadLibrary方法。

    1.2K31

    JNI使用技巧点滴

    我们首先用VC封装出图像转换的DLL,然后用JAVA的本地化方法JNI调用用于图像转换的DLL,最后用JavaBean调用JNI生成的DLL。 中声明所调用的库名称System.loadLibrary( String libname );,在库的搜寻路径中定位这个库。...3) 还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。?实现放在C中实现,稍后将做说明。 4) 如果加了static,表明是静态方法。...或者在VC的tools/options/directories中设置,把头文件给包含进来。 对程序的一点解释: 1)      前文不是说过,加了static和不加只是一个参数的区别吗。...以上是我们通过JNI方法调用的一个简单C程序。但在实际情况中要比这复杂的多。特别是在通过JNI调用其他DLL时,还有很多的地方需要注意。

    44210

    Android so 加载原理分析

    四、小结 动态库加载程,调用栈如下: System.loadLibrary() Runtime.loadLibrary() Runtime.doLoad() Runtime_nativeLoad...无论哪种方式,最终都会调用到LoadNativeLibrary()方法,该方法主要操作: 通过dlopen打开动态共享库; 通过dlsym获取JNI_OnLoad符号所对应的方法; 调用该加载库中的JNI_OnLoad...然后会获取动态库中的JNI_OnLoad方法,如果有的话调用之。...可以看到最终没有调用dlclose,当然也不能调用,这里只是加载,真正的函数调用还没有开始,之后就会使用dlopen拿到的句柄来访问动态库中的方法了。...看完这篇文章我们明确了几点: System.loadLibrary会优先查找apk中的so目录,再查找系统目录,系统目录包括:/vendor/lib(64),/system/lib(64) 不能使用不同的

    8K31

    Java关键字——native

    本篇博客我们将介绍Java中的一个关键字——native。   ...native 关键字在 JDK 源码中很多类中都有,在 Object.java类中,其 getClass() 方法、hashCode()方法、clone() 方法等等都是用 native 关键字修饰的。...可能有人会问,Java不是跨平台的吗?如果用 JNI,那么程序不就将失去跨平台的优点?确实是这样的。 JNI 的缺点:   ①、程序不再跨平台。...System.loadLibrary("helloJNI");加载动态库,参数 helloJNI 是动态库的名字。...我们可以这样理解:程序中的方法 helloJNI() 在程序中没有实现,但是我们下面要调用这个方法,怎么办呢?我们就需要对这个方法进行初始化,所以用 static 代码块进行初始化。

    1.9K131

    2019-04-08 Swig java Jni开发指南

    之所以说它是JNI的替 代者,是因为JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成。...,java返回的结果c还需要继续处理的时候,经常出现不可控制的crash,而jna算是中间层,这个层出现的错误完全无法调试,被逼无奈,我们的项目先用jna开发,不得不转jni开发,在使用swig的过程中,...Swig把接口文件看做输入,并生成必要的代码在java中展示接口,从而让java能够理解原生代码中的接口定义。Swig不是一个存根生成器;它产生将要被编译和运行的代码。...System.out.println(example.MAX_HEIGHT); } } c) 执行以下命令,同1.d 只读变量 区别只是在生成的包装类中,...重点:这个只能获得函数指针,然后多写个函数把函数指针传递给c层来调用,java层没有找到方法调用 这种方法会出现一些比较奇怪的类名,例如:SWIGTYPE_p_f_float_float__float

    63010

    分享一个绕过移动端系统限制的增强版dlfunctions库

    Android 7以上dlopen, System.load都是被限制调用的,虽然目前网上有Nougat_dlfunctions等库通过从maps中找so库来绕过加载限制。...虽然这篇文章中主要目的是为了绕过hide api,不过它里面使用的将自己假装成系统调用的方式,一样可以用到System.loadLibrary上去,让系统以为是系统自身在调用System.loadLibrary...private static final String SYMBOL_NAME = "curl_version"; 除了Native版本dlopen接口,byOpen额外提供了java版本的System.loadLibrary...iOS 虽然ios可以直接使用dlopen,但是审核上会有风险,苹果有可能会对提交AppStore的app扫描相关dlopen/dlsym等调用,来判断是否存在一些敏感的私有调用。...为了在通过调用一些私有接口的时候避免被苹果检测到,byOpen也通过自己实现dlopen/dlsym直接从已经加载进来的images列表里面直接查找对应symbol地址来调用。

    1.5K30

    「音视频直播技术」JNI编程常见问题

    Native 库 我们可以使用System.loadLibrary将共享库导入进来。引入Native代码的最好方法如下: 静态类初始化时,调用System.loadLibrary。...return JNI_VERSION_1_6; } 你也可以用共享库的完整路径名调用System.load函数而不是System.loadLibrary。...另一个关于JNI_OnLoad需要注意的事项:任何FindClass操作,都应该在加载共享库的类加载器上下文中调用。...类似地,您可以使用SetArrayRegion调用将数据复制到数组中,并使用GetStringRegion或GetStringUTFRegion从字符串中复制字符。...作为执行JNI_OnLoad的一部分,任何FindClass调用都将使用与System.loadLibrary函数关联的类加载器(这是一个特殊规则,方便了库的初始化)。

    1.6K20

    JNI--非静态native方法使用及cc++调用Java变量

    上次说到了JNI调用的具体步骤,先再JAVA类中定义了静态native方法,使用javah命令生成c/c++的head文件,再实现相应的c或者c++函数,今天来看下java非静态native方法在JNI...中如何使用 在上次的类中定义非静态native方法:getStringFromC2() package com.aruba.jniapplication; public class JniDemo {...workspace\\JniApplication\\app\\src\\main\\java\\com\\aruba\\jniapplication\\myjni.dll"); // System.loadLibrary...理解:我们java中可以直接使用类名.静态方法的方式在外部调用静态方法,但是非静态方法的外部调用必须使用一个实例化的对象。...静态变量和非静态变量的调用区别不大,有相应的static方法,设置java变量的具体步骤为:获取fieldId->调用GetXXXField方法获取java对象->如果是基本对象,直接使用,引用对象(jobect

    1.8K10

    动态加载so库的实现方法与问题处理

    具体的加载代码一般是在Activity页面中增加下面几行,表示在实例化该页面的时候,一开始就从系统目录加载名为libjni_mix.so的库: static { System.loadLibrary...,然后保存到用户目录,并从用户目录加载该so,最后再调用jni方法。...排查结果发现,EasyAR.jar里面的EasyARNative类会从系统目录加载so库,也就是仍然调用了“System.loadLibrary("EasyAR");”。...因为App无法把so文件复制到系统目录,所以导致System.loadLibrary方法找不到libEasyAR.so。...2、如果App包含32位的so库,则它将运行在一个32位的进程中,即VM是由Zytgote创建的。 3、如果App不包含任何so库,则它将默认运行在64位的进程中。

    3.5K20
    领券