有谁知道如何使用Java实现强大的代码移动性?你以前做过吗?
这是我试图实现的目标.
假设我们有2个通过网络进行通信的独立Java应用程序.App A和App B.
App A将类x实例化为对象,并一直在使用它.App B没有此类x的先验知识.
App A需要将类x 的实例迁移到App B.应用程序B应该能够动态加载类x,并保留类x 的状态.
我已经谷歌搜索了一些关于如何在运行时动态加载类的资源.但是,我不确定是否覆盖了通过网络传输对象实例及其状态并动态调用它的机制.
任何指针都会非常有用,请提前感谢!
注:我最感兴趣的是如何这个问题(即方法,方式思考)解决,而不是什么来解决这个问题; 这是因为我的任务是提出自己的解决方案来解决这个问题.虽然指出图书馆/框架是伟大的,但如果答案是从那些曾经做过类似事情的人那里发布的(尽管很少见),那将是理想的选择.
嗨,我要求创建,编译和加载java类运行时.使用FTL我正在创建java源文件,并且如果没有动态依赖,则能够编译源代码.
为了详细说明一个实例,我有两个java源文件,一个接口及其实现类.我能够使用java编译器api编译接口,如下所示
String classpath=System.getProperty("java.class.path");
String testpath =classpath+";"+rootPath+"/lib/is_wls_client.jar;"+rootPath+"/rtds_wls_proxyclient.jar;.;";
File javaFile = new File(javaFileName+".java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
List<String> optionList = new ArrayList<String>();
optionList.addAll(Arrays.asList("-classpath",testpath));
StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null);
Iterable fileObjects = sjfm.getJavaFileObjects(javaFile);
JavaCompiler.CompilationTask task = compiler.getTask(null, null, null,optionList,null,fileObjects);
task.call();
sjfm.close();
Run Code Online (Sandbox Code Playgroud)
我为已经在类路径中的静态类设置类路径,但这种方法不适用于动态创建的类?任何自定义类加载器都会修复?我的最终实现将在web/app服务器中
任何反馈都将受到高度赞赏
Satheesh
手头的情况并不像标题似乎表明的那么简单.
Java 1.6_17通过JWS运行.
我有一个类,让我们说MyClass,它的一个实例成员变量是来自错误的第三方库的Type,在类初始化期间它动态地尝试加载它自己的一些类Class.forName(String).在其中一种情况下,它恰好动态调用:Class.forName("foo/Bar").这个类名不遵循JLS的二进制名称,最终导致a java.lang.NoClassDefFoundError: foo/Bar.
我们有一个自定义ClassLoader,我已经添加了一个清理方法,ClassLoader.findClass(String)并ClassLoader.loadClass(String)修复了这个问题.
我可以称之为:
myCustomClassLoader.findClass("foo/Bar")
然后加载类没有任何问题.但即使我提前加载课程,我仍然会在以后获得异常.这是因为在初始化期间MyClass引用Bar- 他们的代码最终Class.forName("foo/Bar")在某处静态块中调用.如果它试图使用的ClassLoader是我的自定义类加载器,那么这实际上是可以的.但事实并非如此.这是com.sun.jnlp.JNLPClassLoader不做这样的卫生,因此我的问题.
我已经确定将Thread.currentThread().getContextClassLoader()其设置为我的自定义类加载器.但是这(如你所知)没有效果.main()由于我阅读的一些东西,我甚至把它设置为我做的第一件事,MyClass.class.getClassLoader()- 是JNLPClassLoader.如果我可以强迫它不是JNLPClassLoader而是使用我的,那么问题就解决了.
如何通过在类初始化期间进行的静态Class.forName("foo/Bar")调用来控制使用哪个ClassLoader加载类?我相信如果我可以强制MyClass.class.getClassLoader()返回我的自定义类加载器,我的问题将得到解决.
如果有人有想法,我愿意接受其他选择.
TL; DR:帮助我强制Class.forName(String)所引用的第三方库中的所有呼叫MyClass- 使用我选择的类加载器.
我有一个应用程序,允许使用抽象类,人们编写自己的实现.我从目录中将这些实现加载为.class-files.目前,我有这个解决方案:
File classDir = new File("/users/myproject/classes/");
URL[] url = { classDir.toURI().toURL() };
URLClassLoader urlLoader = new URLClassLoader(url);
String filename;
for (File file : classDir.listFiles()) {
filename = string.getFilenameWithoutExtension(file);
if (filename.equals(".") || filename.equals("..") || filename.startsWith("."))
continue;
AbstractClass instance = (AbstractClass)urlLoader
.loadClass("org.mypackage." + filename)
.getConstructor(ConfigUtil.class, DatabaseUtil.class, StringUtil.class)
.newInstance(config, database, string));
instance.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
如您所见 - 我需要指定类所在的包,以便正确加载它们.省略了包裹,我得到了一个
java.lang.NoClassDefFoundError:
MyClass (wrong name: org/mypackage/MyClass)
Run Code Online (Sandbox Code Playgroud)
错误.
现在,从建筑POV来看,我认为设计其他人的类在加载时必须编译为MY包,这是非常糟糕的设计.
所以我问你:有没有办法从文件系统加载类而不必指定它们所在的包?
通过"发布",我的意思是没有对类加载器的引用.
我们遇到了一个问题,即频繁重新部署的Java EE应用程序会占用permgen空间.分析表明,Java EE应用程序中的单例已经传递了对应用程序之外的应用程序类加载器对象的引用(违反Java EE规则),并且在取消部署应用程序时不会清除它们.
假设单例或类对象没有其他引用,那么在释放类的类加载器时是否会调用单例的finalize()? 我想在那里清除流氓入境参考.或者我是在catch-22中,在类加载器本身可以被垃圾收集之前不会调用finalize - 因此由于流氓外部引用而永远不会被调用?
这里的主要问题可能是:
在这种情况下,类对象是否会被垃圾收集? 这可能取决于类加载器行为的规范,或者可能依赖于实现.
参考文献(另一种!;-))将不胜感激,但不是必需的.
我使用classloader和Unsafe :: definedAnonymous()来加载生成的字节码byte [].classLoader.loadClass()返回的Class的使用成功,而它c.getMethod()在哪个c=Unsafe.defineAnonymousClass()API中失败.那么生成的字节码是错的吗?
我的代码:
MainInliner loader = new MainInliner();
Class<?> c =null;
byte[] bytes = ...
if(args[0].equals("0")){
c = loader.loadClass(name, bytes, 0, bytes.length); // Classloader.loadClass.
}else{
c = Unsafe.defineAnonymousClass(Hoster, bytes, null);
}
Method m = c.getMethod("main", new Class<?>[] { String[].class });
Run Code Online (Sandbox Code Playgroud)
错误是:
Exception Details:
Location:
code/sxu/asm/example/Caller.test(II)V @98: lload_3
Reason:
Type integer (current frame, locals[3]) is not assignable to long
Current Frame:
bci: @98
flags: { }
locals: { 'code/sxu/asm/example/Caller', integer, integer, integer, integer, integer, integer, …Run Code Online (Sandbox Code Playgroud) java classloader dynamic-class-loaders bytecode-manipulation java-bytecode-asm
othersMap.put("maskedPan", Class.forName("Some Class"));
Run Code Online (Sandbox Code Playgroud)
删除对动态类加载的使用。
规则
Changelog类不应动态加载动态加载的类可能包含由静态类初始化程序执行的恶意代码。在IE中,您甚至不必实例化或显式调用此类上的方法即可受到攻击。对于每次使用动态类加载,此规则都会引起一个问题。不兼容的代码示例
String className = System.getProperty("messageClassName");
Class clazz = Class.forName(className); // Noncompliant
Run Code Online (Sandbox Code Playgroud)
看到
我正在尝试使用自定义类加载器来加载应用程序所需的所有依赖项。我已经在网站上实现了 customerClassLoader:https : //www.javacodegeeks.com/2013/03/java-handmade-classloader-isolation.html
但是,我不明白如何告诉我的应用程序在需要时使用自定义 classLoader。
例如:让我们说,我有一种方法来发出 http 请求,如下所示。如何告诉应用程序使用自定义 classLoader 加载所需的 jars?
private HttpResponse get() {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
return response;
}
Run Code Online (Sandbox Code Playgroud) I found that mock object in Mockito would throw ClassNotFoundException when used in Spark. Here is a minimal example:
import org.apache.spark.{SparkConf, SparkContext}
import org.mockito.{Matchers, Mockito}
import org.scalatest.FlatSpec
import org.scalatest.mockito.MockitoSugar
trait MyTrait {
def myMethod(a: Int): Int
}
class MyTraitTest extends FlatSpec with MockitoSugar {
"Mock" should "work in Spark" in {
val m = mock[MyTrait](Mockito.withSettings().serializable())
Mockito.when(m.myMethod(Matchers.any())).thenReturn(1)
val conf = new SparkConf().setAppName("testApp").setMaster("local")
val sc = new SparkContext(conf)
assert(sc.makeRDD(Seq(1, 2, 3)).map(m.myMethod).first() == 1)
}
}
Run Code Online (Sandbox Code Playgroud)
which would throw the following exception:
[info] …Run Code Online (Sandbox Code Playgroud) 我们在项目中使用hibernate验证器和动态类加载(通过加载类进入单独的类加载器).在我们意识到不需要该类之后,我们删除对类和类加载器的所有引用,然后GC收集它.
我们得到的结果:应用程序启动后的一段时间,java反射停止工作.
java.lang.reflect.UndeclaredThrowableException: null
at com.sun.proxy.$Proxy253.equals(Unknown Source)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager$CacheKey.equals(ConstraintValidatorManager.java:287)
at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:940)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.java:104)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:301)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(ConstraintTree.java:242)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:163)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:116)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateComposingConstraints(ConstraintTree.java:396)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:98)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:87)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:73)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:616)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:581)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement(ValidatorImpl.java:527)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:495)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:460)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:410)
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:207)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:281)
... Many spring filters calls ...
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:122)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at *someAwesomePackage*.microservice.rest.spring.webapp.CabinetRequestFilter.doFilterInternal(CabinetRequestFilter.java:98)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at …Run Code Online (Sandbox Code Playgroud) java reflection dynamic-class-loaders hibernate-validator string-interning
java ×8
classloader ×4
finalize ×1
java-ee ×1
jnlp ×1
mockito ×1
permgen ×1
reflection ×1
scala ×1
string ×1