Tag: 类加载器

替换实例化类的实现而不触及代码(java)

我有遗留的代码我不想碰。 public class LegacyCode{ public LegacyCode() { Service s = new ClassA(); s.getMessage(); } } ClassA提供CORBA服务调用的地方。 public class ClassA implements Service{ @Override public String getMessage() { // Make CORBA service call… return “Class A”; } } 界面Service看起来像; public interface Service { String getMessage(); } 出于测试目的,我想用存根替换Service的实现(在ClassA实现的LegacyCode )。 public class ClassB implements Service { @Override public String […]

将给定类(例如,java.lang.Object)转换为字节数组。 可能吗?

假定类加载器接受将给定类的字节数组作为输入,返回一个Class ,我想知道是否可以执行相反的操作,即传递一个Class并获取其字节数组? 请记住,我不是在谈论序列化!

如何在运行时从外部jar访问方法?

这是发布在以下问题的延续: 如何在运行时加载jar文件 我不确定如何继续方法调用级别。 根据我的理解,从clazz对象,我将使用getMethod或getDeclaredMethod来获取一个Method对象,我将从中调用invoke。 当然,调用需要一个实例。 那么那就是示例代码中所谓的doRun吗? 我是否需要执行doRun.run()方法调用,即使我想执行一个不同于main的方法(假设它是在运行调用调用的doRun对象上的主要方法)? 为了更好地澄清原始post,我问:doRun.run()是否启动了一个新线程来执行clazz类型的类对象的实例? 感谢您帮我解决这个问题。 我确实看过“how-should-i-load-jars-dynamic-at-runtime”(抱歉,只允许一个超链接),但这看起来违反了我引用的第一篇文章中的Class.newInstance邪恶警告。

是否有办法强制类加载器加载包,即使它的类没有被加载?

假设一个java代码库有一个名为“com.example”的包。 在运行时,我们可以通过调用获取此包 Package p = Package.getPackage( “com.example” ); //(returns null) 甚至可以通过调用获取所有包的列表 Packages[] ps = Package.getPackages(); 问题是 – 如果ClassLoader尚未从包中加载任何类,则它们将无法用于这些函数调用。 我们可以通过首先强制加载包中的一个类来强制它加载包,如下所示: this.getClass().getClassLoader().loadClass( “com.example.SomeClass” ); Package p = Package.getPackage( “com.example” ); //(returns non-null) 但是,这很hacky并且需要提前知道属于包的某个类的名称。 所以问题是 – 有没有办法按名称获取Package的实例,无论ClassLoader是否做了什么? 关于类加载/包在这种情况下如何工作的假设是否准确?

动态加载Jar并实例化已加载类的Object

我尝试动态地将jar加载到我的Java项目中。 这是类加载器的代码: public class ClassLoad { public static void main(String[] args) { String filePath = new String(“C:/Users/Mehdi/Desktop/JavaClassLoader/jarred.jar”); URL myJarFile = null; try { myJarFile = new URL(“file://”+filePath); } catch (MalformedURLException e1) { System.out.println(“1”); e1.printStackTrace(); } URLClassLoader cl = URLClassLoader.newInstance(new URL[]{myJarFile}); Class Jarred = null; try { Jarred = cl.loadClass(“com.jarred.exp.Jarred”); } catch (ClassNotFoundException e) { System.out.println(“2”); […]

我可以通过配置java.policy文件拒绝访问jvm类吗?

我想在我的jdk6\jre\lib\security\java.policy文件中添加一个禁止来创建一些被appengine列入黑名单的类。 例如,当应用程序尝试实例化javax.naming.NamingException时,我希望我的本地jvm抛出exception。 有可能的? 我会在这里解释我的具体问题。 Google提供的服务(GAE-google应用引擎)对可以使用的类有一些限制。 例如,不实例化javax.naming包中的JNDI类。 他们还提供了一个测试服务器,可以用来在我的机器上测试这个应用程序,但是这个服务器允许这样的类,并且可以扩展代码。 您发现只有在将应用程序上传到谷歌后才使用黑名单。 我在想是否无法在开发jvm上执行此类黑名单强制执行。 另外我认为这很容易,他们可能已经提供了这样的政策文件。

在java Web应用程序中加载外部库

我的方案如下: 我有一个部署到servlet容器的WebApp.war。 此WebApp.war在WEB-INF / lib中包含以下库: lib_a.jar lib_b.jar 我有另一个库,比如lib_vendor.jar,由于许可问题我无法在WebApp / WEB-INF / lib中部署,所以我让我们的客户在安装应用程序后在tomcat / lib中复制这个库。 但由于lib_vendor.jar需要在Web应用程序类加载器中加载的lib_a.jar和lib_b.jar,因此我无法使用lib_vendor.jar。 如何在Web应用程序的同一类加载器中加载外部库(不在WEB-INF / lib中)?

如何在动态编译源文件时为JavaCompiler提供接口?

我正在尝试在运行时编译和加载一个类,而不知道该类的包。 我知道该类应该遵守一个接口,以及源的位置(以及类名)。 我正在尝试以下方法: /* Compiling source */ File root = new File(“scripts”); File sourceFile = new File(root, “Test.java”); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); compiler.run(null, null, null, sourceFile.getPath()); Test.java文件看起来像什么 import foo.Itest; public class Test implements Itest{ … } 而且我得到一个cannot find symbol symbol : class Itest来自编译器的cannot find symbol symbol : class Itest错误。 如何为编译器提供接口 (已经加载)以避免此错误? [编辑 – 已解决]:错误来自于接口是ITest并且源是指Itest接口的Itest 。

如何在线程java应用程序中确定运行时的主类?

我想在运行时确定我的应用程序启动的类名,带有main()方法的类名,但我在另一个线程中,我的堆栈跟踪不会一直回到原始类。 我已经搜索了系统属性以及ClassLoader提供的所有内容,并且没有提供任何内容。 这些信息不可用吗? 谢谢。

将字节数组加载到内存类加载器中

我想知道如何将字节数组加载到内存 URLClassLoader中? 字节数组是jar文件的解密字节(如下所示)! 大多数内存类加载器都使用ClassLoader而不是URLClassLoader! 我需要它使用URLClassLoader。 byte[] fileB = Util.crypt.getFileBytes(inputFile); byte[] dec; dec = Util.crypt.decrypt(fileB, “16LENGTHLONGKEYX”.getBytes()); //Load bytes into memory and load a class here? 谢谢!