标签: classloader

Java动态加载类

我试图动态地将类加载到组件中.我正在使用文件选择器来选择将要加载的.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中

java swing dynamic classloader

10
推荐指数
3
解决办法
3399
查看次数

JBoss和不同版本的Hibernate

我们使用的是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)

由于截止日期即将来临,我想我最好问一下它是否可能?:)

java jboss hibernate classloader

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

运行PHPUnit测试用例时,PHP类解决了同一目录中的类的问题

我安装了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和B.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无法工作.有任何想法吗?

谢谢.

php phpunit classloader

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

Java VM何时尝试加载Class依赖项?

我遇到了一个我不明白的类加载器问题.我在使用Java 1.6.0和Windows XP的OSX上看到过相同的行为.

当我使用MyListenerMyObject不是在类路径中运行以下代码时,我得到了一个NoClassDefFoundError.但是,如果我删除该MyObject.add(my)行或替换它,MyObject.add(null)那么代码运行正常.

请注意,实际上从未使用过具有无法解析的依赖项的方法.

我不明白为什么MyObject.add(my)导致VM尝试加载MyListenerMyListener 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)

没有什么有趣的MyObjectMyListener:

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版说:

关于何时执行解析的唯一要求是, …

java classloader

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

classLoader何时加载导入?

假设我只有静态方法的类.类加载器在将类加载到内存时会加载每个导入的类吗?或者只有当一个方法需要访问它时才会加载导入?

问题是当类加载到内存时,或者在某些方法想要使用它们之前,类加载器是否加载导入.如果它是第一个选项,我可能需要划分我的一些Util类,以便更专业.

java classloader

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

以编程方式填充JVM永久生成(PermGen)内存区域

我需要测试一些我开发的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)

是否有更优雅的解决方案来实现这一目标?

java permgen classloader

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

创建一个ClassLoader以从字节数组加载JAR文件

我正在寻找一个自定义类加载器,它将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)

java arrays jar classloader

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

ClassLoader替换预加载的类?

一般问题: 是否可以使用ClassLoader替换预加载(通过系统,例如在Android的%android%/ frameworks/base/preloaded-classes文件中找到)类?

具体: 我试图在我的应用程序中创建WebView之前使用DexClassLoader替换android.net.*中找到的类.我可以得到一个Class对象,但getMethods()例如给了我一个我希望在未修改/原始类实现中的数组.这是由于preloaded-classes系统吗?

基本设置和伪代码:

  1. 修改android.net.*类,添加一些测试方法/等.
  2. 编译并以classes.dex结束
  3. jar cf mytest.jar classes.dex
  4. 在APK资产中包含mytest.jar
  5. 创建DexClassLoader并通过loadClass()获取Class
  6. Class对象上的getMethods()返回一个我期望在#1中没有修改的数组

我可以提供有关我正在使用的设置和代码的更多详细信息(如果需要).

reflection android classloader dex

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

Parcel.readHashMap使用什么类加载器?

我正在使用以下代码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")?

java generics android classloader parcelable

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

Java ASM字节码修改 - 更改方法体

我在罐子里有一个类的方法,我想用自己的身体交换它.在这种情况下,我只想让方法将"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)

java bytecode code-injection classloader java-bytecode-asm

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