大家好,感谢您的关注!我有一个既容易又明显的问题,但我被卡住了.
我想通过自定义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) 我正在使用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) 要么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 Bytecode生成程序依赖图(PDG)以进行进一步的程序分析.由于这是旧的(论文来自'87)和可能是众所周知的技术,我认为适当的工具将很容易获得 - 但我无法找到它们.
事实上,广泛的搜索只出现了一些结果:
所以我的问题如下:那里有没有活着的维护实现?有没有人有上述任何一个项目的经验?你会推荐什么?
感谢您的投入,非常感谢!
我有一个Java源文件的行号,并希望以编程方式获取该行号的搜索方法.
我查看了ANTLR,这对我没什么帮助.
Janino(http://www.janino.net)看起来很有希望,我会扫描并解析(如果需要,编译)代码.然后我可以使用JDI和
ReferenceType.locationsOfLine(int lineNumber)
Run Code Online (Sandbox Code Playgroud)
我仍然不知道如何使用JDI来做这件事,并且没有找到这方面的任何教程.
也许还有一些我完全失踪的方式.
如何迭代通配符通用?基本上我想内联以下方法:
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)
我的问题很简单:有没有办法放一些可以迭代的通配符类型,或者这是泛型的限制(意味着不可能这样做)?
好吧,这是一个奇怪的问题:我有一个使用一些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) 我目前正在处理一些我继承的代码.执行它时,很多异常会记录到控制台,其中一个这样的异常如下所示:
["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
),但我不确定.
所以我的问题是:如何在这里继续?该异常是什么意思,我如何调试和查找它以及如何解决它?我真的没有任何线索,并会欣赏任何提示.谢谢!
我有一些我运行的第三个库代码,经过一段时间后我遇到了OutOfMemoryError
.所以我启动了Eclipse MAT并分析了内存.现在似乎无法处理内存,因为有一个对象显示为GC root: Native Stack
.阅读文档:
本机代码中的in或out参数,例如用户定义的JNI代码或JVM内部代码.这通常是这种情况,因为许多方法具有本机部分,并且作为方法参数处理的对象成为GC根.例如,用于文件/网络I/O方法或反射的参数.
现在我的问题是:如何确认该对象是在JNI或其他地方使用的(即如何找到使用它的代码)?我可以以某种方式处置对象吗?我还有其他选择吗?
谢谢你的帮助!
我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 ×10
classloader ×1
debugging ×1
encoding ×1
exception ×1
foreach ×1
generics ×1
hashcode ×1
hashmap ×1
hibernate ×1
line-numbers ×1
logging ×1
maven ×1
memory-leaks ×1
parsing ×1