小编roe*_*erj的帖子

如何使用自定义ClassLoader?

大家好,感谢您的关注!我有一个既容易又明显的问题,但我被卡住了.

我想通过自定义ClassLoader提供动态创建的Java类,供第三方库使用.

现在我的问题是:当我不自己直接加载这些类时,如何设置我的自定义ClassLoader来加载这些类?

我想当我使用我的ClassLoader加载某个类时,它就变成了这个类的ClassLoader,并且从该类加载的所有类都将通过我的ClassLoader引导.

我按照这个官方教程创建了一个自定义的ClassLoader:http://java.sun.com/developer/onlineTraining/Security/Fundamentals/magercises/ClassLoader/help.html.

public class DynamicClassloader extends ClassLoader {

    private Map<String, Class<?>> classesMap = new HashMap<String, Class<?>>();

    public DynamicClassloader(ClassLoader parent) {
        // Also tried super(parent);
        super(sun.misc.Launcher.getLauncher().getClassLoader());
    }

    // Adding dynamically created classes
    public void defineClass(String name, Class<?> clazz) {
        classesMap.put(name, clazz);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // load from parent
        Class<?> result = findLoadedClass(name);
        if (result != null) {
            return result;
        }
        try {
            result = findSystemClass(name);
        } catch (Exception …
Run Code Online (Sandbox Code Playgroud)

java classloader

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

"不存在具有给定标识符的行",尽管它存在

我正在使用Hibernate并获取

线程"main"中的异常org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:[#271]

这个错误的奇怪之处在于,具有给定id的对象存在于数据库中.我在有问题的应用程序运行中插入了有问题的记录.如果我在同一次运行中访问它(即相同的休眠会话),则检索数据似乎没有问题.

仅仅因为它可能是映射的错误:

public class ProblemClass implements Persistent {
  @ManyToOne(optional = false)
  private MyDbObject myDbObject;
}
public class MyDbObject implements Persistent {
  @OneToMany(mappedBy = "myDbObject")
  private List<ProblemClass> problemClasses;
  @ManyToOne(optional = false)
  private ThirdClass thirdClass;
}
Run Code Online (Sandbox Code Playgroud)

我绝对不知道哪里可以看.任何提示高度赞赏!

只是为了澄清:数据被插入到应用程序的另一个RUN中.它肯定在数据库中,因为我可以在应用程序终止后通过SQL查询看到它.在那之后,即再次启动应用程序时,我在数据库的FIRST查询中得到错误 - 没有删除,也没有涉及回滚.

另外:因为有人问过,这里是获取数据的代码:

public List<ProblemClass> getProblemClasses() {
    Query query = session.createQuery("from ProblemClass");
    return query.list();
}
Run Code Online (Sandbox Code Playgroud)

只是为了完成它,这里是插入它的通用代码(在获取应用程序的另一个RUN之前):

public void save(Persistent persistent) {
    session.saveOrUpdate(persistent);
}
Run Code Online (Sandbox Code Playgroud)

java hibernate

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

Apache Commons Exec为包含空格的参数生成了太多引号?

要么Apache Commons Exec中存在错误,要么我错误地使用API​​,但是当我使用CommandLine类添加包含空格的参数时,会添加一些引号,然后是给定参数的一部分.

例如:当我打电话java "what version",我得到java.lang.NoClassDefFoundError: what version了,当我打电话java "\"what version\""(其中包含转义引号,是命令行参数本身的一部分),我得到java.lang.NoClassDefFoundError: "what version".

因此,以下测试失败,因为正如您在最后一行中所看到的,Apache Exec正在生成后者版本,它应该生成第一个版本:

@Test
public void testArgumentQuoting() throws Exception {
    DefaultExecutor executor = new DefaultExecutor();
    DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    PumpStreamHandler streamHandler = new PumpStreamHandler(out, out);
    executor.setStreamHandler(streamHandler);
    CommandLine cmdLine = new CommandLine("java");
    cmdLine.addArgument("what version");
    executor.execute(cmdLine, resultHandler);
    resultHandler.waitFor();
    String resultPattern = "Exception in thread \"main\" java\\.lang\\.NoClassDefFoundError: ([\\w \"]+)";
    Pattern pattern = Pattern.compile(resultPattern);
    Matcher matcher = …
Run Code Online (Sandbox Code Playgroud)

java apache-commons-exec

10
推荐指数
2
解决办法
3619
查看次数

如何从Java中的字节码生成程序依赖图(PDG)

我想从Java Bytecode生成程序依赖图(PDG)以进行进一步的程序分析.由于这是旧的(论文来自'87)和可能是众所周知的技术,我认为适当的工具将很容易获得 - 但我无法找到它们.

事实上,广泛的搜索只出现了一些结果:

  • Bandera项目于2006年被废弃.
  • 印度河项目自2007年以来似乎没有得到任何努力,除了它在2009年成为开放源代码.
  • Moose JEE项目似乎很新,因为基本上没有任何文档.
  • 还有Soot框架,它提供了一些类(参见JavaDoc),但似乎缺少一代的实现.事实上,Soot是Bandera和Indus的基础.

所以我的问题如下:那里有没有活着的维护实现?有没有人有上述任何一个项目的经验?你会推荐什么?

感谢您的投入,非常感谢!

java code-analysis static-analysis static-code-analysis

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

如何在Java源文件中获取给定行号的周围方法

我有一个Java源文件的行号,并希望以编程方式获取该行号的搜索方法.

我查看了ANTLR,这对我没什么帮助.

Janino(http://www.janino.net)看起来很有希望,我会扫描并解析(如果需要,编译)代码.然后我可以使用JDI

ReferenceType.locationsOfLine(int lineNumber)
Run Code Online (Sandbox Code Playgroud)

我仍然不知道如何使用JDI来做这件事,并且没有找到这方面的任何教程.

也许还有一些我完全失踪的方式.

java parsing line-numbers

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

如何迭代通配符泛型?

如何迭代通配符通用?基本上我想内联以下方法:

private <T extends Fact> void iterateFacts(FactManager<T> factManager) {
    for (T fact : factManager) {
        factManager.doSomething(fact);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果此代码在如图所示的单独方法中,则它起作用,因为泛型方法上下文允许定义通配符类型(此处T)可以迭代.如果尝试内联此方法,则方法上下文消失,并且不再迭代通配符类型.即使在Eclipse中自动执行此操作也会失败并显示以下(无法编译)代码:

...
for (FactManager<?> factManager : factManagers) {
    ...
    for ( fact : factManager) {
        factManager.doSomething(fact);
    }
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

我的问题很简单:有没有办法放一些可以迭代的通配符类型,或者这是泛型的限制(意味着不可能这样做)?

java generics foreach

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

MVN编译不使用UTF-8编码

好吧,这是一个奇怪的问题:我有一个使用一些UTF-8字符的java测试文件.当我用Maven编译它时,使用

mvn -Dfile.encoding=UTF-8 -Dproject.build.sourceEncoding=UTF-8 test
Run Code Online (Sandbox Code Playgroud)

(因此设置感知平台编码和源文件编码,请参阅maven平台编码)我得到类似的东西

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building project
[INFO]    task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory path/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources {execution: default-testResources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory path/src/test/resources
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Compiling 7 …
Run Code Online (Sandbox Code Playgroud)

java encoding maven

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

StackTrace中"锁定的同步器数量= 1"是什么意思?

我目前正在处理一些我继承的代码.执行它时,很多异常会记录到控制台,其中一个这样的异常如下所示:

["bg-thread-0" Id=28 RUNNABLE
    at java.util.zip.ZipFile.read(Native Method)
    at java.util.zip.ZipFile.access$1400(ZipFile.java:56)
    at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:677)
    -  locked java.util.zip.ZipFile@67369c20
    at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:413)
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
    at org.eclipse.osgi.baseadaptor.bundlefile.BundleEntry.getBytes(BundleEntry.java:102)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:511)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:455)
    ...

    Number of locked synchronizers = 1
    - java.util.concurrent.ThreadPoolExecutor$Worker@66e5b079

]
Run Code Online (Sandbox Code Playgroud)

我正在使用Logback进行日志记录.现在我不知道生成或记录该异常的位置,因为该信息被删除了....我也不知道这意味着什么.我想这与死锁有关(因为Number of locked synchronizers = 1),但我不确定.

所以我的问题是:如何在这里继续?该异常是什么意思,我如何调试和查找它以及如何解决它?我真的没有任何线索,并会欣赏任何提示.谢谢!

java debugging logging exception

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

MAT中显示的内存泄漏为GC根:本机堆栈

我有一些我运行的第三个库代码,经过一段时间后我遇到了OutOfMemoryError.所以我启动了Eclipse MAT并分析了内存.现在似乎无法处理内存,因为有一个对象显示为GC root: Native Stack.阅读文档:

本机代码中的in或out参数,例如用户定义的JNI代码或JVM内部代码.这通常是这种情况,因为许多方法具有本机部分,并且作为方法参数处理的对象成为GC根.例如,用于文件/网络I/O方法或反射的参数.

现在我的问题是:如何确认该对象是在JNI或其他地方使用的(即如何找到使用它的代码)?我可以以某种方式处置对象吗?我还有其他选择吗?

谢谢你的帮助!

java java-native-interface memory-leaks out-of-memory

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

反序列化对象图时,hashCode()中的NullPointerException

final在Java类中有一个肯定要初始化的字段.当我序列化和反序列化相应的对象图时,我得到一个NPE,因为该字段在hashCode()方法中使用但显然还没有回读.我创建了一个最小的测试用例,其中还包含serialize()/ deserialize()methods(如果这些是bug),但我似乎无法理解(底层)问题是什么或如何解决它.

public class TestSerializerTest {

private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestSerializerTest.class);

private File workDir;

@Before
public void setUp() {
    workDir = new File("target/tmp");
}

@After
public void tearDown() {
    workDir.delete();
}

private static class ManagingContainer implements Serializable {

    private static final long serialVersionUID = 1L;

    private final Set<Contained> containedElements = new HashSet<Contained>();

    public Contained getContained(List<String> descriptors) {
        Contained contained = new Contained(this, descriptors);
        containedElements.add(contained);
        return contained;
    }
}

private static class …
Run Code Online (Sandbox Code Playgroud)

java hashmap hashcode deserialization

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