小编Mar*_*ius的帖子

使用ClassLoader定义同一个类两次

我正在开发一个项目,它涉及读取给定JAR文件中的所有类,修改其中一些类(在字节码级别,使用ASM),以及创建ClassLoader这些修改过的类.目前,在修改类之后,我创建了一个可见的ClassLoader类的自定义实例defineMethod(String, byte[]).

这是自定义的代码ClassLoader(它是一个嵌套类):

private static class ExposingClassLoader extends ClassLoader {

    private ExposingClassLoader(JarFile jar) throws MalformedURLException {
        super(new URLClassLoader(new URL[] { new URL("jar:" + new File(jar.getName()).toURI().toURL() + "!/") }));
    }

    private void defineClass(String name, byte[] data) {
        defineClass(name, data, 0, data.length);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可能已经注意到我创建了父类加载器了URLClassLoader.当我构造自定义类加载器时,我将URLClassLoader引用包含未修改的类文件的JAR.修改了一些类文件后,我遍历它们并defineMethod(String, byte[])为每个文件调用.一些修改的类彼此依赖,即,类A可以是类B的超类,或类C可以实现类D,或类E可以包含对类F的引用,等等.

对于我的测试,我使用两个类.第一个是命名的fn,第二个是命名的fi,并且fi扩展fn并包含多个类型的字段fi.这两个类都存在于用于构造的JAR文件中ClassLoader,唯一的区别是它们未经修改.出于某种原因,如果我定义类fn它工作正常(它不应该?该类fn …

java classloader

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

Java Swing:在JPanel的组件下绘画?

我有一个JPanel,里面有一个按钮.按钮的位置无关紧要.该paint(Graphics g)代码是:

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        /* drawing code */
    }

如果我想用黑色矩形填充面板的整个空间,同时在面板中也有按钮,填充的矩形将简单地覆盖所有内容.因此,按钮周围没有按钮然后是黑色,整个面板都是黑色的.

有没有办法修改面板或绘画程序,以便在自定义绘画的顶部绘制组件?

我试图把super.paint(g)绘画结束,如:

    @Override
    public void paint(Graphics g) {
        /* drawing code */
        super.paint(g);
    }

......以为它会首先进行自定义绘画,然后简单地将组件放在它上面.但是,如果这样做,自定义绘画将完全消失,只显示按钮.也就是说,只有一个按钮和一个白色(默认)背景而不是黑色矩形.

有任何想法吗?

谢谢!

编辑:我想澄清黑色矩形是一个例子.我知道我可以简单地设置背景颜色,但我想最终能够做任何我想要的自定义绘画.

java swing components paint jpanel

4
推荐指数
2
解决办法
3446
查看次数

一旦到达流末尾,是否应该明确关闭连接?

我正在NIO中编写一些网络代码.

ByteBuffer buf = ByteBuffer.allocate(Hub.getBufferSize());
int read = channel.read(buf);
if (read == -1) {
    client.disconnect();
    return;
} else if (read == 0) {
    return;
}
Run Code Online (Sandbox Code Playgroud)

我知道这是一个读取返回-1,这意味着已到达连接流的末尾.但这是否意味着与该客户的连接现已结束?此外,如果服务器在到达流末尾时明确关闭通道,还是冗余?

谢谢.

java networking nio

4
推荐指数
1
解决办法
1081
查看次数

通过终端构建时更改构建输出目录

最近,我发现了一个程序,它是IDE和文本编辑器之间的混合体.它支持语言的语法,它可以进行格式化,但它不会为您构建和运行程序.我正在运行Mac OS X 10.6.8.我查看了如何使用Terminal应用程序构建C代码.格式为:

gcc [file]
Run Code Online (Sandbox Code Playgroud)

很简单.问题是我无法更改输出构建文件的目录,也无法更改名称.默认情况下,编译的每个文件都在主目录中以"a.out"的名称输出.如何指定输出目录和名称?

谢谢!

c macos terminal build output-directory

3
推荐指数
1
解决办法
4873
查看次数

当存在AtomicReferenceArray时,并发列表和集合有什么意义?

据我所知,AtomicReferenceArray类允许以原子方式更新各个元素.这将使集合线程安全.并发集合使用各种算法来允许集合是线程安全的,但也是非阻塞的.我知道有些集合类提供了方便的方法,add(...)比如排队等某些功能.但忽略这一点,并专注于添加和检索元素,是否有理由使用其中一个并发集合而不是AtomicReferenceArray?

还有,性能呢?

java concurrency performance atomic

3
推荐指数
1
解决办法
773
查看次数

处理一个finally块

我有一些代码创建了一个JarFile和一个URLClassLoader,我想在最后关闭它们.当然,我决定使用该finally块来处理清理:

JarFile jar = ...;
URLClassLoader loader = ...;
try {
    // work ...
} finally {
    jar.close();
    loader.close();
}
Run Code Online (Sandbox Code Playgroud)

但是,两个close()调用都可以抛出异常,因此如果jar.close()抛出异常,则loader.close()无法访问.我想解决这个问题的一种方法是jar.close()使用try-catch块进行处理:

JarFile jar = ...;
URLClassLoader loader = ...;
try {
    // work ...
} finally {
    try {
        jar.close();
    } catch(IOException e) {
    } 
    loader.close();
}
Run Code Online (Sandbox Code Playgroud)

但这看起来很丑陋而且过分.是否有一种优雅的方法来处理finally块中与清理相关的异常?

java exception-handling try-finally

3
推荐指数
1
解决办法
258
查看次数

创建Thread对象或实际启动线程是否昂贵?

考虑这个问题.

现在有很多原因导致创建线程的成本很高,特别是需要分配大量内存并且需要注册线程的事实.

现在考虑这段代码:

Thread thread = new Thread(new SomeRunnable());
thread.start();
Run Code Online (Sandbox Code Playgroud)

哪一部分是"昂贵的"部分?实际创建Thread对象的行还是启动线程的行?或两者?为什么我问的原因是因为我写一个游戏服务器的组件和我辩论,如果我要尽快播放器连接创建Thread对象,一旦玩家完成登录启动线程,还是应该我都在玩家完成登录后创建并启动线程.

java multithreading

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

使用哈希码确定对象等价

假设我有一个代表游戏牌的简单类,称为Tile:

public class Tile {

    public final int x;
    public final int y;
    public final int plane;

    public Tile(int x, int y, int plane) {
        this.x = x;
        this.y = y;
        this.plane = plane;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        } else if (obj instanceof Tile) {
            Tile other = (Tile) obj;
            return other.x == x && other.y == y && other.plane == plane;
        }
        return false;
    }

    @Override
    public …
Run Code Online (Sandbox Code Playgroud)

java hash equivalence

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

Java的; int []到int

我如何将整数数组转换为整数,但是以一种特殊的方式?

例如,我如何将{1,9,9,0}转换为1990年?

java arrays integer

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

Java的JIT编译器是否"扩展"了琐碎的循环?

我正在编写我的应用程序的性能敏感部分,我很好奇JIT编译器(如果有的话)将如何优化以下方法:

private static int alphaBlend(int foreground, int background) {
    int alpha = (foreground >> 24) & 0xFF;
    int subAlpha = 0xFF - alpha;
    return ((((((foreground >> 16) & 0xFF) * alpha) + (((background >> 16) & 0xFF)) * subAlpha) >> 8) << 16)
            | ((((((foreground >> 8) & 0xFF) * alpha) + (((background >> 8) & 0xFF)) * subAlpha) >> 8) << 8)
            | ((((foreground & 0xFF) * alpha) + ((background & 0xFF)) * subAlpha) >> 8);
}

private static …
Run Code Online (Sandbox Code Playgroud)

java optimization performance jit

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

(Class <?>)和getClass()之间有什么区别?

考虑以下两行:

return loadMethod.invoke(botScriptLoader, file.getName().replaceFirst("\\.class", "")).getClass();

return (Class<?>) loadMethod.invoke(botScriptLoader, file.getName().replaceFirst("\\.class", ""));
Run Code Online (Sandbox Code Playgroud)

当我使用第一行运行我的应用程序时,它不能按预期工作.当我使用第二行运行我的应用程序时,它确实可以正常工作.我不认为这背后的代码是相关的,因为我的观点是两条线之间的行为是不同的.他们为什么表现不同?getClass()返回Class,并且类型转换将对象强制转换为Class - 因此最终结果应该相同.但是,两者表现不同.

java casting object

0
推荐指数
1
解决办法
69
查看次数