我们都知道StringJava 中是不可变的,但请检查以下代码:
String s1 = "Hello World";
String s2 = "Hello World";
String s3 = s1.substring(6);
System.out.println(s1); // Hello World
System.out.println(s2); // Hello World
System.out.println(s3); // World
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[])field.get(s1);
value[6] = 'J';
value[7] = 'a';
value[8] = 'v';
value[9] = 'a';
value[10] = '!';
System.out.println(s1); // Hello Java!
System.out.println(s2); // Hello Java!
System.out.println(s3); // World
Run Code Online (Sandbox Code Playgroud)
为什么这个程序运行这样?为什么价值s1和s2变化,但不是s3?
我有一个使用256位AES加密的应用程序,开箱即用的Java不支持.我知道要使其正常运行我在安全文件夹中安装JCE无限强度jar.这对我作为开发人员来说很好,我可以安装它们.
我的问题是,由于此应用程序将被分发,最终用户很可能不会安装这些策略文件.让最终用户下载这些只是为了使应用程序功能不是一个有吸引力的解决方案.
有没有办法让我的应用程序运行而不覆盖最终用户机器上的文件?可以在没有安装策略文件的情况下处理它的第三方软件?或者从JAR中引用这些策略文件的方法?
我越了解它的力量java.lang.reflect.AccessibleObject.setAccessible,我就越能对它做什么感到惊讶.这是根据我对问题的回答改编的(使用反射来更改静态最终File.separatorChar以进行单元测试).
import java.lang.reflect.*;
public class EverythingIsTrue {
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public static void main(String args[]) throws Exception {
setFinalStatic(Boolean.class.getField("FALSE"), true);
System.out.format("Everything is %s", false); // "Everything is true"
}
}
Run Code Online (Sandbox Code Playgroud)
你可以做真正令人发指的事情:
public class UltimateAnswerToEverything {
static Integer[] ultimateAnswer() {
Integer[] ret = new Integer[256];
java.util.Arrays.fill(ret, 42);
return ret;
}
public static void main(String args[]) throws Exception { …Run Code Online (Sandbox Code Playgroud) 我最近在stackoverflow中提出了一个问题,然后找到答案.最初的问题是除了互斥锁或垃圾收集之外的什么机制可以减缓我的多线程java程序?
我惊恐地发现HashMap已经在JDK1.6和JDK1.7之间进行了修改.它现在有一个代码块,可以使创建HashMaps的所有线程同步.
JDK1.7.0_10中的代码行是
/**A randomizing value associated with this instance that is applied to hash code of keys to make hash collisions harder to find. */
transient final int hashSeed = sun.misc.Hashing.randomHashSeed(this);
Run Code Online (Sandbox Code Playgroud)
最终打电话给谁
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
Run Code Online (Sandbox Code Playgroud)
查看其他JDK,我发现JDK1.5.0_22或JDK1.6.0_26中不存在这种情况.
对我的代码的影响是巨大的.它使得当我在64个线程上运行时,我获得的性能低于在1个线程上运行时的性能.一个JStack显示大多数线程花费大部分时间在Random循环中旋转.
所以我似乎有一些选择:
在我开始使用这些路径之前(所有这些路径看起来非常耗时并且可能产生很大影响),我想知道我是否错过了一个明显的技巧.任何人堆叠溢出的人都可以建议哪条路更好,或者找出新想法.
谢谢您的帮助
我试图JSONObject按照我想要的顺序打印我的页面时遇到问题.在我的代码中,我输入了这个:
JSONObject myObject = new JSONObject();
myObject.put("userid", "User 1");
myObject.put("amount", "24.23");
myObject.put("success", "NO");
Run Code Online (Sandbox Code Playgroud)
但是,当我在页面上看到显示时,它会给出:
JSON格式的字符串: [{"success":"NO","userid":"User 1","bid":24.23}
我需要按用户ID,数量,然后成功的顺序.已经尝试在代码中重新订购,但无济于事.我也试过.append......在这里需要一些帮助谢谢!!
class WithPrivateFinalField {
private final String s = "I’m totally safe";
public String toString() {
return "s = " + s;
}
}
WithPrivateFinalField pf = new WithPrivateFinalField();
System.out.println(pf);
Field f = pf.getClass().getDeclaredField("s");
f.setAccessible(true);
System.out.println("f.get(pf): " + f.get(pf));
f.set(pf, "No, you’re not!");
System.out.println(pf);
System.out.println(f.get(pf));
Run Code Online (Sandbox Code Playgroud)
输出:
s = I’m totally safe
f.get(pf): I’m totally safe
s = I’m totally safe
No, you’re not!
Run Code Online (Sandbox Code Playgroud)
为什么它以这种方式工作,你能解释一下吗?第一个印刷品告诉我们私人"s"字段没有像我期望的那样被改变.但是如果我们通过反射获得该字段,则第二个打印显示,它会更新.
根据教程:
的
static改性剂,在用所述组合final改性剂,也可以用来定义常量.该final修饰符表明这个字段的值不能改变.
只有涉及的类型是原始的,我才同意这一点.对于引用类型,例如Point2D其位置属性不是的类的实例final(即,我们可以改变其位置),这种变量的属性(例如public static final Point2D A = new Point2D(x,y);仍然可以改变).这是真的?
我正在使用slf4j,我想对我的代码进行单元测试,以确保在某些条件下生成警告/错误日志消息.我宁愿这些是严格的单元测试,所以我不想从文件中提取日志配置以测试日志消息的生成.我正在使用的模拟框架是Mockito.
我知道在Java中,我们可以通过创建一个类的实例new,clone(),Reflection和serializing and de-serializing.
我创建了一个实现Singleton的简单类.
我需要一直停止创建我的类的实例.
public class Singleton implements Serializable{
private static final long serialVersionUID = 3119105548371608200L;
private static final Singleton singleton = new Singleton();
private Singleton() { }
public static Singleton getInstance(){
return singleton;
}
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException("Cloning of this class is not allowed");
}
protected Object readResolve() {
return singleton;
}
//-----> This is my implementation to stop it but Its not working. …Run Code Online (Sandbox Code Playgroud) 由于Java 8接口可以有默认方法.我知道如何从实现方法中显式调用该方法,即(请参阅在Java中显式调用默认方法)
但是,如何在代理上使用反射显式调用默认方法?
例:
interface ExampleMixin {
String getText();
default void printInfo(){
System.out.println(getText());
}
}
class Example {
public static void main(String... args) throws Exception {
Object target = new Object();
Map<String, BiFunction<Object, Object[], Object>> behavior = new HashMap<>();
ExampleMixin dynamic =
(ExampleMixin) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),new Class[]{ExampleMixin.class}, (Object proxy, Method method, Object[] arguments) -> {
//custom mixin behavior
if(behavior.containsKey(method.getName())) {
return behavior.get(method.getName()).apply(target, arguments);
//default mixin behavior
} else if (method.isDefault()) {
//this block throws java.lang.IllegalAccessException: no …Run Code Online (Sandbox Code Playgroud) java ×9
reflection ×5
final ×2
aes ×1
collections ×1
constants ×1
immutability ×1
java-8 ×1
jce ×1
json ×1
mocking ×1
mockito ×1
performance ×1
policyfiles ×1
security ×1
singleton ×1
slf4j ×1
static ×1
string ×1
unit-testing ×1