前段时间,在我的工作中,我需要保护一些课程,以防止其他人阅读代码.为此,我创建了一个EncryptedClassLoader,它加载了以前加密的类,并且还可以加载普通(未加密)类.以这种方式工作有点复杂,并且也进行测试(编译,然后加密,然后解密).
是否有任何免费框架可以做我需要的,并且易于处理?我的意思是,不仅混淆,而且还加密文件,所以没有人可以读取或调试这部分代码.我可以很容易地更改加密密钥(在我的应用程序中,它是硬编码的).
提前致谢.
今天是个好日子.
我在我的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:
更改资源文件加载的方式,清理依赖项位,一切正常,我想昨天不是我的一天.
我有一个基本问题.考虑这个简单的代码:
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状态的对象?
为什么Throwable.class.getClassLoader()返回null?有一些隐藏的知识吗?
我有一个属于2个不同包的同一个类.
package x1.y1.Class
packgage x2.y2.Class
Run Code Online (Sandbox Code Playgroud)
是否有可能如果我正在调用x1.y1.Classvia类加载器,x2.y2.Class而是加载?
我试图创建一个代码来动态加载一个类,并使用它来创建新的实例和运行强制转换.我可以使用这个方法从新加载的类中创建一个实例: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) 我正在尝试在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) 我正在尝试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.defineClass和ByteArray),并尝试调用内部调用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) 我试图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) 我有一节课:
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 …
classloader ×10
java ×8
ear ×1
encryption ×1
groovy ×1
java-ee ×1
kotlin ×1
protection ×1
reflection ×1
resources ×1
string ×1