标签: classloader

如何保护/加密Java类?

前段时间,在我的工作中,我需要保护一些课程,以防止其他人阅读代码.为此,我创建了一个EncryptedClassLoader,它加载了以前加密的类,并且还可以加载普通(未加密)类.以这种方式工作有点复杂,并且也进行测试(编译,然后加密,然后解密).

是否有任何免费框架可以做我需要的,并且易于处理?我的意思是,不仅混淆,而且还加密文件,所以没有人可以读取或调试这部分代码.我可以很容易地更改加密密钥(在我的应用程序中,它是硬编码的).

提前致谢.

java encryption protection classloader

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

未加载类路径的Groovy资源

今天是个好日子.

我在我的groovy项目中使用spock框架进行测试(IDE - Intellij Idea 12.6).我的spock规范类将文件名传递给groovy对象进行处理(该文件肯定在classpath中),但当我尝试以这种方式获取该文件时

    def resource = getClass().getClassloader().getResourceAsStream(filepath)
    assert resource != null : "No input stream found for path ${filepath}"
    def rootNode = new XmlParser().parse(resource)
Run Code Online (Sandbox Code Playgroud)

然后resource == null.

我尝试调试,在Expression Evaluation窗口中,此代码getClass().getResource(fileName)返回资源.

我试图检查在第一种情况下使用哪个类加载器(在类中使用代码)和第二种情况(表达式评估窗口).

在第一种情况下,类加载器是sun.misc.Launcher$AppClassLoader@18dabf1,但在Expression Evaluation窗口中,classloader是groovy.lang.GroovyClassLoader$InnerLoader@1e69757我认为这是我的资源为空的原因.

有人可以指导我做错了什么,如何加载该资源文件?

更新:

更改了资源文件的解析方式.当filepath- 文件的完整路径有效,但如果filepath只是文件名和那个文件在classpath中resource == null

更新2:

更改资源文件加载的方式,清理依赖项位,一切正常,我想昨天不是我的一天.

groovy resources classloader

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

Java类实例化 - 内存中有什么?

我有一个基本问题.考虑这个简单的代码:

class A{
   void someMethod(){
      B b = new B(); // Line 3
      B c = new B(); // Line 4
   }
}
Run Code Online (Sandbox Code Playgroud)

当执行第3行时,将类B加载到内存中(即:我们为类型为'Class'的对象分配物理空间(假设使用id - classLaoder1.B),类型包含类B的代码).

问题1#接下来会发生什么? - B类(占B的状态)的实例被创建基于该classLoader.B实际上包含B的信息的事实(已分配的物理内存)?

问题2#另外,在第-4行,由于classLoader.B存在于内存中,因此在内存中创建了一个包含c状态的对象?

java instantiation classloader

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

为什么Throwable.class.getClassLoader()返回null?

为什么Throwable.class.getClassLoader()返回null?有一些隐藏的知识吗?

java classloader

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

Java类加载

我有一个属于2个不同包的同一个类.

package x1.y1.Class
packgage x2.y2.Class
Run Code Online (Sandbox Code Playgroud)

是否有可能如果我正在调用x1.y1.Classvia类加载器,x2.y2.Class而是加载?

java classloader

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

是否可以动态加载类并将其用作类型?

我试图创建一个代码来动态加载一个类,并使用它来创建新的实例和运行强制转换.我可以使用这个方法从新加载的类中创建一个实例:myClass.newInstance();.但我不能用它作为一种类型.例如:myClass myObj = new myClass();它不起作用.有可能以某种方式执行吗?

这是我试图制作的代码:

URL classUrl;
classUrl = new URL("file:///C:/classes/");
URL[] classUrls = { classUrl };
URLClassLoader ucl = new URLClassLoader(classUrls);
Class c = ucl.loadClass("Operation");
Class MyIn = ucl.loadClass("MyInter"); 
Object o = c.newInstance(); //IT WORKS
System.out.println(((MyIn) o).sum(2, 4)); //IT DOES NOT WORK. Message: MyIn cannot be resolved to a type
Run Code Online (Sandbox Code Playgroud)

java instantiation classloader

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

如何在EAR中的jar和共享库之间的Websphere Liberty Profile中获取类加载器可见性

我正在尝试在Websphere Liberty Profile(最新版本16)中使用一些遗留代码.

这段代码以一组架构的库的形式出现,我将其设置为WLP中的共享库,以及作为EAR的应用程序

我遇到一个问题,其中一个库中的jar中的某些代码试图实例化一个位于EAR内部的类(在lib文件夹中的jar中).

我得到这个堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: com.isb.holamu.fnegocio.ln.AAL_FNegocioFactory <-- This class (1) is inside a .jar inside the EAR
       at com.ibm.ws.classloading.internal.AppClassLoader.findClassCommonLibraryClassLoaders(AppClassLoader.java:491)
       at com.ibm.ws.classloading.internal.AppClassLoader.findClass(AppClassLoader.java:274)
       at java.lang.ClassLoader.loadClass(Unknown Source)
       at com.ibm.ws.classloading.internal.AppClassLoader.findOrDelegateLoadClass(AppClassLoader.java:469)
       at com.ibm.ws.classloading.internal.AppClassLoader.loadClass(AppClassLoader.java:441)
       at java.lang.ClassLoader.loadClass(Unknown Source)
       at java.lang.Class.forName0(Native Method)
       at java.lang.Class.forName(Unknown Source)
       at com.isb.bs.bl.base.MetaFacadeFactory.createFactoryInstance(MetaFacadeFactory.java:74) <-- This class (2) is in the shared library in WLP.
Run Code Online (Sandbox Code Playgroud)

这些是来自server.xml的相关位:

   <!-- Server shared library -->

   <library id="architecture" >
         <fileset dir="${server.config.dir}/lib/jars" includes="*.jar" scanInterval="5s"/>  <-- (2) is here

   </library>

   <enterpriseApplication autoStart="true" id="sample" location="sample.ear" name="sample"> <-- (1) is …
Run Code Online (Sandbox Code Playgroud)

java ear classloader java-ee websphere-liberty

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

Kotlin类重新加载伴随对象/函数

我正在尝试Kotlin类重装,但最近我遇到了一些接近这个问题:

package com.aurieh.reloading
fun doSomething(): String { // a function that does not belong to the class,
    // so it gets compiled as FileName$doSomething$...
}

class FileName {
    // do things with doSomething
}
Run Code Online (Sandbox Code Playgroud)

如果我重新加载这个类(使用ImplClassLoader.defineClassByteArray),并尝试调用内部调用doSomething的方法,我得到类似于的错误:

java.lang.IllegalAccessError: tried to access method com.aurieh.reloading.FileName.doSomething$default()Ljava/lang/String; from class com.aurieh.ares.reloading.FileName`
Run Code Online (Sandbox Code Playgroud)

我会解释这个,好像重新加载的类没有附加doSomething ..所以我的问题是,我将如何解决这个错误?通过某种方式将doSomething附加到重装类加载器?

作为参考,我的类重装代码:

class Reloader : ClassLoader() {
    fun load(name: String, bytes: ByteArray, offset: Int, len: Int): Class<*> {
        return defineClass("com.aurieh.reloading.$name", bytes, offset, len)
    }
}
Run Code Online (Sandbox Code Playgroud)

并加载:

val bytes = File("../classes/path/to/class/FileName.class").readBytes()
Reloader().load("FileName", …
Run Code Online (Sandbox Code Playgroud)

classloader kotlin

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

java.lang.NoSuchMethodException Java

我试图jars在顶层调用同一依赖库的2个不同版本Main class。因此,我创建了一个具有2个实现类的接口,这两个类都有一个run方法,该方法使用一个将要使用的通用api somejar-1.0.0-SNAPSHOT.jar,另一个将somejar-2.0.0-SNAPSHOT.jar通过显式调用ClassLoader 来使用。

public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException {

    ClassLoader loader1 = new URLClassLoader( new URL[] { new File("/Users/haddad/.m2/repository/com/company/somejar-1.0.0-SNAPSHOT.jar").toURL() });
    ClassLoader loader2 = new URLClassLoader( new URL[] { new File("/Users/haddad/.m2/repository/com/company/somejar-2.0.0-SNAPSHOT.jar").toURL() });

    Class<?> c1 = loader1.loadClass("com.engine.na.EngineV1");
    Class<?> c2 = loader2.loadClass("com.engine.na.EngineV2");

    IEngine app1 = (IEngine) c1.newInstance();
    IEngine app2 = (IEngine) c2.newInstance();

    Integer s1 = app1.run();
    Integer s2 = app2.run();
    Assert.equals(s1,s2,"Outputs from somejar-1.0 and somejar-2.0 did not match, perhaps somejar-2.0 …
Run Code Online (Sandbox Code Playgroud)

java reflection classloader

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

为什么java相同的String具有不同的哈希码

我有一节课:

package com.test;
public class TestA {
    public static final String TEST = "??ABCDEFG";

    public TestA() {
        System.out.println(TEST.hashCode());
    }
}
Run Code Online (Sandbox Code Playgroud)

同一个类(没有包,把它放在E:,javac Test.java中,得到Test.class):

public class TestA {
    public static final String TEST = "??ABCDEFG";

    public TestA() {
        System.out.println(TEST.hashCode());
    }
}
Run Code Online (Sandbox Code Playgroud)

测试类:

package com.test;
import java.net.URL;
import java.net.URLClassLoader;


public class Test3 {

    public static void main(String[] args) throws Exception {

        URLClassLoader loaderA = new URLClassLoader(new URL[]{new URL("file:E:/")});

        Class clazzA = loaderA.loadClass("TestA");
        clazzA.newInstance();

        TestA testA = new TestA();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

250218913

1111280555 …

java string classloader

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