相关疑难解决方法(0)

使用Java反射更改私有静态final字段

我有一个带有private static final字段的类,不幸的是,我需要在运行时更改.

使用反射我得到这个错误: java.lang.IllegalAccessException: Can not set static final boolean field

有没有办法改变价值?

Field hack = WarpTransform2D.class.getDeclaredField("USE_HACK");
hack.setAccessible(true);
hack.set(null, true);
Run Code Online (Sandbox Code Playgroud)

java reflection static final private

454
推荐指数
8
解决办法
22万
查看次数

使用反射更改静态最终File.separatorChar进行单元测试?

具体来说,我正在尝试为一个方法创建单元测试,该方法需要用于File.separatorChar在windows和unix上构建路径.代码必须在两个平台上运行,但当我尝试更改此静态最终字段时,我会收到JUnit错误.

任何人都知道发生了什么事吗?

Field field = java.io.File.class.getDeclaredField( "separatorChar" );
field.setAccessible(true);
field.setChar(java.io.File.class,'/');
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我明白了

IllegalAccessException: Can not set static final char field java.io.File.separatorChar to java.lang.Character
Run Code Online (Sandbox Code Playgroud)

思考?

java reflection file-io unit-testing

26
推荐指数
1
解决办法
2万
查看次数

为什么String类是不可变的,即使它有一个名为"hash"的非最终字段

我正在阅读Joshua Bloch撰写的有效Java第15项.在第15项中谈到"最小化可变性"时,他提到了使对象不可变的五条规则.其中之一就是让所有领域都是最终的.这是规则:

使所有字段成为最终字段:这清楚地以系统强制执行的方式表达您的意图.此外,如果对新创建的实例的引用在没有同步的情况下从一个线程传递到另一个线程,则必须确保正确的行为,如内存模型中所述[JLS,17.5; Goetz06 16].

我知道String类是一个不可变类的例子.通过源代码我看到它实际上有一个非最终的哈希实例.

//Cache the hash code for the string
private int hash; // Default to 0
Run Code Online (Sandbox Code Playgroud)

String如何成为不可变的呢?

java string immutability

21
推荐指数
2
解决办法
2850
查看次数

对象反射的安全风险是什么?

因此,经过几个小时的解决方法,目前在Google App Engine上禁用了Reflection的限制,我想知道是否有人可以帮助我理解为什么对象反射可能构成威胁.是因为我可以检查一个类的私有变量还是有其他更深层次的原因?

java security reflection code-access-security

20
推荐指数
1
解决办法
1万
查看次数

您可以做什么而不用Java注释?

典型的用例是针对简单的事情,比如@Override,但显然你可以用它们做更多的事情.如果你突破它们的极限,就会得到像Project Lombok这样的东西,尽管我的理解是这是一个巨大的滥用注释.你到底能做什么?您可以在编译时和注释运行时执行哪些操作?你能做什么?

java annotations

19
推荐指数
1
解决办法
2738
查看次数

私人成员在Java中真的更"安全"吗?

学习Java我有时被教导使用private访问修饰符,以免将"敏感信息"暴露给其​​他类,好像这可能会打开一个合法的安全漏洞.但是我从来没有遇到过限制成员可见性不仅仅是以面向对象的方式建模程序的便利的情况.

privateJava类中的字段和函数实际上是否比其他类更"安全"?


编辑 - 汇编最佳答案.

为什么private不代表"安全":

  • 反编译器允许静态查看字节码
  • 反射库允许运行时访问私有成员

有什么private好处:

  • 由于强制方法级访问而导致的代码可维护性
  • 隐藏实现细节的代码模块化

java oop

15
推荐指数
1
解决办法
1850
查看次数

java中的不可变类

遵循所有java标准,我使我的类不可变

A. Defined class as final
B. declared all fields as private and final
C. No setter method
D. No method changes the state of object
E. declared all method as final
F. Safer/defencieve copying of collection/ non mutable object fields.
Run Code Online (Sandbox Code Playgroud)

这些是我在设计不可变类时所做的初步检查点.

但是还有一个问题,我的对象仍然可以通过java反射进行修改,对不对?或者我在课堂上错过了什么?

提前致谢.

java reflection immutability

8
推荐指数
1
解决办法
1429
查看次数

Java反射框架和安全性

假设我的应用程序的外部库中有一个单例类.但我仍然可以使用反射创建该特定类的实例.像这样

    Class clas = Class.forName(Private.class.getName());

    for(Constructor c : clas.getDeclaredConstructors()){
        c.setAccessible(true);
        Private p = (Private) c.newInstance();
        System.out.println(p);
    }
Run Code Online (Sandbox Code Playgroud)

我怎么能限制这个?.

谢谢J

java reflection

6
推荐指数
1
解决办法
1523
查看次数

如何通过调用反射方法来检测何时修改属性

我有以下课程

public class MyClass {
   private int myAttr;

   public void setAttr(int a) { 
      myAttr = a; 
      Thread.dumpStack();
   }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以检测到任何修改的尝试myAttr.好吧,几乎任何.当有人myAttr使用Field.set()方法修改时,它不起作用.如何捕获Java反射用法?

java reflection

5
推荐指数
1
解决办法
147
查看次数

JVM和私有方法

我是Java的初学者.我学到的第一件事是可执行类的main()方法应该是公共的,并且给出的理由是因为这个方法将由JVM调用,它应该在类外可见,因此应该是公共的.现在在学习系列化我发现,writeObject()readObject()一个私有方法Serializable的类可以由JVM而序列化被称为和反序列化对象!如果它们是私有方法,那么JVM如何调用它们?如果它可以为什么它不能调用main()方法?

翻阅一些java文档后,我读到了这句话"JVM可以访问对象的私有方法".因为我们使用ObjectInputStream的实例调用readObject(),所以JVM可以访问它,而main()方法是静态或类方法,并且在没有实例化类的任何对象的情况下调用应该是公共的,以便JVM可以访问!那有意义吗 ?我不知道 .

java serialization jvm private public

5
推荐指数
2
解决办法
1055
查看次数