我的应用程序包含几个JAR文件.我想迭代所有JAR文件并找到子类化特定类的所有类,以便我可以使它们的静态初始化器运行.
我查看了java.lang.ClassLoader的Javadocs,但找不到任何执行此操作的方法.
我正在尝试实现"Product Trader"模式(http://www.ubilab.com/publications/print_versions/pdf/plop-96-producttrader.pdf),在抽象超类中使用"自注册"类.超类将有一个HashMap,它映射子类提供的服务和处理该服务的java.lang.Class文件.
问题是类在加载之前不会运行它的静态初始值设定项.如果我可以迭代所有子类,我可以强制每个子加载并运行它的初始化器.
谢谢,拉尔夫
我试图想出一个解决方案,根据消息类型,在运行时选择处理"消息"的类.我知道我可以使用这样的东西
if msg_type = "A"
MsgAProcessor.execute(message);
else if msg_type = "B"
MsgBProcessoror = execute(message);
....
....
....
Run Code Online (Sandbox Code Playgroud)
我不想使用上面的方法,因为我不希望代码知道我可以处理的消息类型的任何信息.我希望将来能够为新的消息类型添加新的消息处理器.我现在想到的解决方案如下
目前有3个消息处理器
MsgAProcessor
MsgBProcessor
MsgBProcessor
Run Code Online (Sandbox Code Playgroud)
所有这三个类都有一个名为execute的方法,它将以自己的方式处理消息.我创建了一个名为MsgProcessor的接口,并在接口中添加了execute()方法.
现在我很难知道调用者应该调用哪个消息处理器而不必检查消息类型.例如,我不能这样做
MsgProcessor proc = new MsgAprocessor()proc.execute()
上面将要求在if语句中,因为它需要在找到消息类型后立即调用.我还想避免使用实现类类型进行实例化.
有没有更好的方法来实现同样的目标?
我希望能够从接口调用MsgProcessor.execute,并让运行时环境知道要根据消息类型调用哪个实现类.
我有一个javaagent jar,我把它放在bootclasspath上
Boot-Class-Path: myagent.jar
Run Code Online (Sandbox Code Playgroud)
在MANIFEST.MF文件中.
我需要找到jar所在文件系统的目录.
然而,这里描述的方法似乎并不适合我:
new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ProtectionDomain.getCodeSource()返回null.我想这种情况正在发生,因为jar已被放在引导类路径中.因此,我也无法通过MyClass.getClassLoader()来获取资源位置.
我使用的是Java 6.
任何人都可以告诉如何获得罐子的位置?
我有类文件有这样的方法:
public boolean validate(String str) {}
Run Code Online (Sandbox Code Playgroud)
这个验证方法中有很多代码,但我只想让它总是返回true或false.有人能指出我如何修改类文件来实现这一目标吗?
bytecode classloader bytecode-manipulation java-compiler-api
我知道这可能与类加载器有关,但是我找不到一个例子(可能是我正在谷歌搜索错误的关键字.
我试图从字符串加载一个类(或方法).该字符串不包含类的名称,但包含类的代码,例如
class MyClass implements IMath {
public int add(int x, int y) {
return x + y;
}
}
Run Code Online (Sandbox Code Playgroud)
然后做这样的事情:
String s = "class MyClass implements IMath { public int add(int x, int y) { return x + y; }}";
IMath loadedClass = someThing.loadAndInitialize(string);
int result = loadedClass.add(5,6);
Run Code Online (Sandbox Code Playgroud)
现在显然,someThing.loadAndInitialize(string)- 部分是我不知道如何实现的部分.这甚至可能吗?或者更容易运行JavaScripts并以某种方式"给"变量/对象(如x和y)?
谢谢你的任何提示.
我的印象是Class.forName(String className)使用了Thread.currentThread().getContextClassLoader()加载类,但显然情况并非如此.
因此我的问题是,ClassLoader Class.forName默认使用什么?是ClassLoader.getSystemClassLoader()吗?
这有什么之间的区别Thread.currentThread().getContextClassLoader()和ClassLoader.getSystemClassLoader()?
我有一个java web start应用程序,我需要从jnlp文件中禁用字节码验证.
这可以通过设置JAVAWS_VM_ARGS ="- noverify "或设置-Xverify:none来轻松完成,但此处的文档说web start不支持在jnlp文件中添加这些参数.
我试过这个:
<j2se version="1.6+" java-vm-args="-noverify -showversion -verbose" >
在资源标签下,它跳过-noverify并接受另外两个.
任何帮助表示赞赏.
说我有一些Java代码:
public class Widget {
...whatever
}
Run Code Online (Sandbox Code Playgroud)
以及一些类加载的代码Widget:
ClassLoader widgetLoader = Widget.class.getClassLoader();
Run Code Online (Sandbox Code Playgroud)
能widgetLoader永远null?为什么/为什么不呢?如果是这样,在什么情况下呢?
我有一个程序使用的库.该库在resources文件夹中加载一个特殊目录.
在图书馆我有方法
public class DataRegistry{
public static File getSpecialDirectory(){
String resourceName = Thread.currentThread().getContextClassLoader().getResource("data").getFile().replace("%20", " ");
File file = new File(resourceName);
return file;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的程序中我有主要方法
public static void main(String args[]){
System.out.println(Data.getSpecialDirectory());
}
Run Code Online (Sandbox Code Playgroud)
当我在数据程序中的junit测试中执行getSpecialDirectory()时,将获取资源并且一切正常.
当我在数据程序(导入的jar)之外的main方法中执行getSpecialDirectory()时,我得到了jar数据目录,而不是执行该程序的程序所期望的目录.
我想让父类加载器能解决这个问题......我相信我的理解可能会有一个根本问题.
为清楚起见:
(图书馆)此文件的第15行:https://gist.github.com/AnthonyClink/11275442
(用法)此文件的第31行:https: //gist.github.com/AnthonyClink/11275661
我的poms可能与它有关,所以分享它们可能很重要:
(图书馆) https://github.com/Clinkworks/Neptical/blob/master/pom.xml
(用法) https://github.com/Clinkworks/Neptical-Maven-Plugin/blob/master/pom.xml
我很确定这对于专家来说是非常基础的东西,但对我来说,作为一个新手,它给我带来了困难.
我有3个解析器,每个解析器都有自己的功能,将来会有更多的解析器.现在我想做的是:我希望我的应用程序在运行时根据要出现的页面选择正确的解析器.
为此,我做了以下内容:我有一个接口(IWebParser):
public interface IWebParser {
public abstract Object execute(String page, URL url);
public abstract List<SimpleWebPosting> parse(String page, URL url, List<String> tokens);
public abstract Boolean canExecute(URL url);
}
Run Code Online (Sandbox Code Playgroud)
我的每个解析器都实现了这个接口.我有另一个名为ParserControl的类,其中有一个方法提交(String page,URL url) - 这是我的程序总是调用的,只要有一个页面要解析.此类ParserControl从xml文件获取可用的解析器,并尝试(在while语句中)任何解析器是否可以解析相关页面.这是通过canExecute(URL url)方法完成的.现在,在canExecute上收到true后,我想执行该特定的解析器.
我的类ParserControl看起来像这样:
public class ParserControl {
private static final Logger logger = Logger.getLogger("de.comlineag.snc.parser.ParserControl");
// the list of operational web parser as taken from the properties file is stored within this structure
private static List<IWebParser> webParser;
// the ParserControl instance - used during instantiation of the class …Run Code Online (Sandbox Code Playgroud) classloader ×10
java ×9
bytecode ×2
reflection ×2
class-design ×1
dynamic ×1
jar ×1
java-ee ×1
javaagents ×1
jnlp ×1
null ×1
parsing ×1