Tag: 参考

JNI错误:访问过时的弱全局引用

我在本机代码中缓存对Java对象的引用,如下所示: // java global reference deleter // _JAVA_ENV is an instance of JNIEnv that is cached globally and just // valid in current thread scope static void g_java_ref_deleter(jobject ptr) { _JAVA_ENV->DeleteGlobalRef(ptr); } // native class caches a java object reference class NativeA { private: shared_ptr M_java_object; public: setJavaObject(jobject obj) { M_java_object = shared_ptr(_JAVA_ENV->NewGlobalRef(obj), g_java_ref_deleter); } […]

如何在多个类之间传递对象? Java的

public class FooClass { BarClass bar = null; int a = 0; int b = 1; int c = 2; public FooClass(BarClass bar) { this.bar = bar; bar.setFoo(this); } } public class BarClass { FooClass foo = null; public BarClass(){} public void setFoo(FooClass foo) { this.foo = foo; } } 别处… BarClass theBar = new […]

Java中的引用变量里面有什么?

我们知道对象引用变量包含表示访问对象的方式的位。 它不包含对象本身,但它包含指针或地址之类的东西。 我正在阅读Head-First Java(第2版)的书,并在书中写出(见第3章,第54页) 在Java中,我们并不真正知道引用变量中的内容。 我们知道无论它是什么,它都代表着一个也只有一个对象。 并且JVM知道如何使用引用来获取对象。 – 我想问一下: 对象引用变量是否包含指针,地址或什么? JVM如何解释这一点?

你能帮我收集一下Java Best Practices在线资料集吗?

我在一个中型开发团队工作,该团队维护一个用Java 1.4编写的8年以上的Web应用程序。 对于新的开发,我总是试图说服人们遵守更新的标准和最佳实践,这些简单的事情就像使用新的命名标准,如HtmlImplementation而不是HTMLImplementation,以及为什么最好是针对接口进行编码而不是针对具体类进行编码,支持不可变性或对象组合过度inheritance。 我在Stackoverflow中找到了这个相当通用的链接 ,它不是面向Java的,也不是完整的。 我总是试图解释我的论点背后的基本原理,并且总是建议人们购买最新版本的Effective Java,但并不是每个开发人员都会毫不犹豫地接受我的话(这是一件好事)。 当这种情况发生时,他们经常会问我指点,他们可以进一步阅读有关该特定良好做法的内容,有时我无法快速找到有关此问题的指示。 您是否可以在最佳实践参考的“集合”中收集在线资料的链接,我总能看到这一点并向我的队友建议“进一步阅读”?

为什么我需要释放在JNI本机函数中创建的全局引用?

我有一个Java类,其中包含用C ++实现的本机函数,称为nz.ac.unitec.BigInteger 。 nz.ac.unitec.BigInteger本机实现很简单,只需包装java.math.BigInteger并调用其构造函数并add , subtract , multiply …函数。 mNativeContext中的字段mNativeContext用于存储对java.math.BigInteger对象的全局引用。 该对象有一个终结器,当对象被垃圾收集时应该销毁全局引用,所以我没有泄漏全局引用。 当我运行一个简单的测试循环来创建许多nz.ac.unitec.BigInteger对象而没有显式释放创建的对象时,JNI错误被报告为跟随日志(LOG1)。 但是如果我在离开测试函数之前显式释放创建的对象,则可以成功执行压力测试。 当我有一个终结器在对象被垃圾回收时删除它们时,为什么JVM会耗尽全局引用? LOG1: F/art (10730): art/runtime/indirect_reference_table.cc:113] JNI ERROR (app bug): global reference table overflow (max=51200) F/art (10730): art/runtime/indirect_reference_table.cc:113] global reference table dump: F/art (10730): art/runtime/indirect_reference_table.cc:113] Last 10 entries (of 51200): F/art (10730): art/runtime/indirect_reference_table.cc:113] 51199: 0x12e88790 java.math.BigInteger F/art (10730): art/runtime/indirect_reference_table.cc:113] 51198: 0x12e85490 java.math.BigInteger F/art […]

Java中==和.equals之间的区别。

我知道这已被覆盖,但我在SO上看到了不一致的论点。 如果我有: String a = “apple2e”; String b = “apple2e”; System.out.println(“a==b? ” + a == b); 我搞错了 。 据我了解,这是因为a和b是对同一个对象的两个不同引用( apple2e )。 所以我会有类似的东西: a (reference_id 123) —— ——— “apple2e” b (reference_id 456) —— 现在,如果我只想比较两个字符串的内容 ,我会使用a.equals(b) 这是否意味着如果两个引用指向同一个对象,JVM只是返回? 所以它不是真的在进行逐字符比较吗? 谢谢 编辑 拿着电话。 感谢delnan指出+优先!!! 当我将其更改为: System.out.println(a == b); 我的确是true 。 这更有意义。 编辑2 我简直不敢相信。 大声笑 我在做: “a==b? ” + a […]

Java返回Object /修改对象(编码指南)

如果一个方法填充/修改一个对象,是否最好返回该对象或将返回类型保持为void,该方法是否会通过其引用修改Object? public Obj populate(Obj o) { …. return o; } public void populate(Obj o) { …. } 我知道这是一个微不足道的问题,但哪一个是最受欢迎的?

在Java中实现Clone还有其他选择吗?

在我的Java项目中,我有一个各种类型的交易者的向量。 这些不同类型的交易者是Trader类的子类。 现在,我有一个方法,以Trader作为参数,并在向量中存储50次左右。 我遇到了问题,因为存储相同的对象50次只是存储同一对象的50个引用 。 我需要存储50 个对象的副本 。 我已经研究过如何实现Clone ,但是我不希望定义一种Trader的程序员不必担心让他们的类可以克隆 。 此外,正如本页所指出的,实现克隆会产生各种问题。 我认为复制构造函数不会起作用,因为如果我在Trader类中定义了一个,它就不会知道它正在复制的Trader的类型,只是制作一个通用的Trader。 我能做什么? 编辑:我不是真的想要制作某个对象的精确副本。 我真正想要做的是在向量中添加一定数量的交易者。 问题是用户需要在参数中指定他想要添加的交易者类型。 这是我想要做的一个例子:(虽然我的语法完全是想象的) public void addTraders(*traderType*) { tradervect.add(new *traderType*()) } 我怎样才能在Java中实现这样的目标?

“变量可能尚未初始化”

我有一个创建String方法和另一个更改字符串的方法 void create(){ String s; edit(s); System.out.println(s); } void edit(String str){ str = “hallo”; } 我的编译器说它“可能尚未初始化”。 有人可以解释一下吗?

Java中的参考究竟是什么?

Java中的参考究竟是什么? 它是一个内存地址吗? Java引用是否相当于解除引用的C ++指针? 换句话说,给出以下内容: Object o1 = new Object(); Object o2 = new Object(); o1 == o2 上面的比较是否相当于比较C ++中的两个指针?