我试图动态地将类加载到组件中.我正在使用文件选择器来选择将要加载的.JAR文件,然后使用选项窗格来获取类的名称.
我已经在互联网上搜索如何将java文件转换为URL以便在URLClassLoader中加载它我已经提出:
File myFile = filechooser.getSelectedFile();
String className = JOptionPane.showInputDialog(
this, "Class Name:", "Class Name", JOptionPane.QUESTION_MESSAGE);
URL myUrl= null;
try {
myUrl = myFile.toURL();
} catch (MalformedURLException e) {
}
URLClassLoader loader = new URLClassLoader(myUrl);
loader.loadClass(className);
Run Code Online (Sandbox Code Playgroud)
我现在收到一个'无法找到符号'错误,将URL加载到URLClassLoader中
我们使用的是JBoss 4.2.3,后者又带有Hibernate的3.2.1.ga版本.我想使用支持JPA 2.0的Hibernate 3.5.1-FINAL.我一直试图通过将我自己的hibernate jar放在我的WEB-INF/lib文件夹中并在jboss-web.xml中为我的WAR创建自己的类加载器来完成这项工作.
<jboss-web>
<loader-repository>
com.moo.foo:archive=catalog-archive
</loader-repository>
</jboss-web>
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
<jboss-web>
<class-loading java2ClassLoadingCompliance="false">
<loader-repository>
com.moo.catalog:loader=catalogLoader
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>
Run Code Online (Sandbox Code Playgroud)
但是我遇到了各种各样的问题,这是我目前坚持的例外:
Caused by: java.lang.NoSuchMethodException: org.hibernate.validator.ClassValidator.<init>(java.lang.Class, java.util.ResourceBundle, org.hibernate.validator.MessageInterpolator, java.util.Map, org.hibernate.annotations.common.reflection.ReflectionManager)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.hibernate.cfg.AnnotationConfiguration.applyHibernateValidatorLegacyConstraintsOnDDL(AnnotationConfiguration.java:443)
Run Code Online (Sandbox Code Playgroud)
由于截止日期即将来临,我想我最好问一下它是否可能?:)
我安装了PHPUnit,我的Test类看起来像这样:
require_once 'PHPUnit/Framework/TestCase.php';
class Test extends PHPUnit_Framework_TestCase {...}
Run Code Online (Sandbox Code Playgroud)
当我在Eclipse中执行PHP脚本时,出现以下错误:
致命错误:第99行的....../PEAR/PHPUnit/Framework/TestCase.php中找不到类'PHPUnit_Framework_Assert'
所以我创建了一个通用的PHP类加载测试:
a.php只会:
class AA {}
Run Code Online (Sandbox Code Playgroud)
B.php:
class BB extends AA {}
new BB();
Run Code Online (Sandbox Code Playgroud)
执行PHP脚本B.php时,我得到同样的错误:
致命错误:第2行的....../B.php中未找到"AA"类
必须有一个选项让PHP能够解析这些类,否则PHPUnit无法工作.有任何想法吗?
谢谢.
我遇到了一个我不明白的类加载器问题.我在使用Java 1.6.0和Windows XP的OSX上看到过相同的行为.
当我使用MyListener而MyObject不是在类路径中运行以下代码时,我得到了一个NoClassDefFoundError.但是,如果我删除该MyObject.add(my)行或替换它,MyObject.add(null)那么代码运行正常.
请注意,实际上从未使用过具有无法解析的依赖项的方法.
我不明白为什么MyObject.add(my)导致VM尝试加载MyListener但MyListener my = new MyListener(){};不会.
public class Main {
public void neverCalled(){
MyListener my = new MyListener(){};
MyObject.add(my);
}
public static void sayHi(){
System.out.println("Hello");
}
public static void main(String[] args) {
System.out.println("Starting...");
sayHi();
}
}
Run Code Online (Sandbox Code Playgroud)
没有什么有趣的MyObject和MyListener:
public class MyObject {
public static void add(MyListener in){}
}
public interface MyListener {}
Run Code Online (Sandbox Code Playgroud)
我根据下面的标准提供的信息做了一些额外的研究.显然,由于一些未知的原因,使用参数进行方法调用似乎会导致加载参数类,而仅仅声明变量不会.
Java VM Spec的第2.17.1节第2版说:
关于何时执行解析的唯一要求是, …
假设我只有静态方法的类.类加载器在将类加载到内存时会加载每个导入的类吗?或者只有当一个方法需要访问它时才会加载导入?
问题是当类加载到内存时,或者在某些方法想要使用它们之前,类加载器是否加载导入.如果它是第一个选项,我可能需要划分我的一些Util类,以便更专业.
我需要测试一些我开发的JMX监控脚本,特别是我想验证我对PermGen区域的监控是否正常.因此,为了测试这一点,我希望能够运行一些加载大量类的代码以便使用PermGen.
我目前的计划是编写一个脚本来生成prefix(1..n).java编译它们然后在cue运行:
for( int i=1 ; i < n ; i ++){
Class.forName("com.mypackage.prefix"+i);
}
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的解决方案来实现这一目标?
我正在寻找一个自定义类加载器,它将JAR从自定义网络加载文件.最后,我必须使用的是JAR文件的字节数组.
我无法将字节数组转储到文件系统上并使用URLClassLoader.
我的第一个计划是JarFile从流或字节数组创建一个对象,但它只支持一个File对象.
我已经写了一些使用了JarInputStream:
public class RemoteClassLoader extends ClassLoader {
private final byte[] jarBytes;
public RemoteClassLoader(byte[] jarBytes) {
this.jarBytes = jarBytes;
}
@Override
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class<?> clazz = findLoadedClass(name);
if (clazz == null) {
try {
InputStream in = getResourceAsStream(name.replace('.', '/') + ".class");
ByteArrayOutputStream out = new ByteArrayOutputStream();
StreamUtils.writeTo(in, out);
byte[] bytes = out.toByteArray();
clazz = defineClass(name, bytes, 0, bytes.length);
if …Run Code Online (Sandbox Code Playgroud) 一般问题: 是否可以使用ClassLoader替换预加载(通过系统,例如在Android的%android%/ frameworks/base/preloaded-classes文件中找到)类?
具体: 我试图在我的应用程序中创建WebView之前使用DexClassLoader替换android.net.*中找到的类.我可以得到一个Class对象,但getMethods()例如给了我一个我希望在未修改/原始类实现中的数组.这是由于preloaded-classes系统吗?
基本设置和伪代码:
我可以提供有关我正在使用的设置和代码的更多详细信息(如果需要).
我正在使用以下代码HashMap<String, String从包中读取类型> 的地图:
in.readHashMap(HashMap.class.getClassLoader());
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,但我得到一个警告:
Type safety: The expression of type HashMap needs unchecked conversion to conform to Map<String,String>
Run Code Online (Sandbox Code Playgroud)
有没有"正确"的方法,使用不同的类加载器?或者我应该一起去@SuppressWarnings("unchecked")?
我在罐子里有一个类的方法,我想用自己的身体交换它.在这种情况下,我只想让方法将"GOT IT"打印到控制台并返回true;
我正在使用系统加载器来加载jar的类.我使用反射使系统类加载器能够通过字节码加载类.这部分似乎工作正常.
我按照这里找到的方法替换示例:asm.ow2.org/current/asm-transformations.pdf.
我的代码如下:
public class Main
{
public static void main(String[] args)
{
URL[] url = new URL[1];
try
{
url[0] = new URL("file:////C://Users//emist//workspace//tmloader//bin//runtime//tmgames.jar");
verifyValidPath(url[0]);
}
catch (Exception ex)
{
System.out.println("URL error");
}
Loader l = new Loader();
l.loadobjection(url);
}
public static void verifyValidPath(URL url) throws FileNotFoundException
{
File filePath = new File(url.getFile());
if (!filePath.exists())
{
throw new FileNotFoundException(filePath.getPath());
}
}
}
class Loader
{
private static final Class[] parameters = new Class[] {URL.class};
public static void addURL(URL …Run Code Online (Sandbox Code Playgroud)