什么是反思,为什么它有用?
我对Java特别感兴趣,但我认为在任何语言中原则都是一样的.
我已经在维基百科和其他网站上阅读过关于OSGi的内容,但我并没有真正看到全局.它说它是一个基于组件的平台,您可以在运行时重新加载模块.另外,给出的"实际示例"是Eclipse插件框架.
我的问题是:
OSGi的清晰简单定义是什么?
它解决了哪些常见问题?
"常见问题"我指的是我们每天面临的问题,例如"OSGi可以做些什么来提高我们的工作效率/乐趣/简单?"
据维基百科称,猴子补丁是:
一种在不改变原始源代码的情况下扩展或修改动态语言的运行时代码的方法.
来自同一条目的以下陈述使我感到困惑:
在Ruby中,术语monkey patch被误解为对类的任何动态修改,并且通常用作在运行时动态修改任何类的同义词.
我想知道Ruby修补猴子的确切含义.它是在做类似下面的事情,还是其他什么?
class String
def foo
"foo"
end
end
Run Code Online (Sandbox Code Playgroud) 我不想讨论这种方法的优点,只要有可能.我相信答案是"不".但也许有人会让我感到惊讶!
想象一下,你有一个核心小部件类.它有一个calculateHeight()返回高度的方法.高度太大 - 这导致按钮(比如说)太大了.您可以扩展DefaultWidget以创建自己的NiceWidget,并实现自己calculateHeight()的返回更好的大小.
现在,一个库类WindowDisplayFactory,在一个相当复杂的方法中实例化DefaultWidget.您希望它使用您的NiceWidget.工厂类的方法看起来像这样:
public IWidget createView(Component parent) {
DefaultWidget widget = new DefaultWidget(CONSTS.BLUE, CONSTS.SIZE_STUPIDLY);
// bunch of ifs ...
SomeOtherWidget bla = new SomeOtherWidget(widget);
SomeResultWidget result = new SomeResultWidget(parent);
SomeListener listener = new SomeListener(parent, widget, flags);
// more widget creation and voodoo here
return result;
}
Run Code Online (Sandbox Code Playgroud)
这就是交易.结果使DefaultWidget深入其他对象的层次结构中.问题 - 如何让这个工厂方法使用我自己的NiceWidget?或者至少calculateHeight()在那里自己动手.理想情况下,我希望能够修补DefaultWidget,以便其calculateHeight做正确的事情......
public class MyWindowDisplayFactory {
public IWidget createView(Component parent) {
DefaultWidget.class.setMethod("calculateHeight", myCalculateHeight);
return super.createView(parent);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在Python,Ruby等方面可以做的事情setMethod().虽然我已经发明了这个名字.对我开放的其他选择是:
createView()方法的代码复制并粘贴到我自己的继承工厂类的类中工厂类无法更改 …
假设我有三个类,example.ClassA,example.ClassB和example.ClassLoader.ClassA打印出HelloWorld,ClassB导入example.ClassA并调用其main()方法.如果我这样做:
java -cp Example.jar -Djava.system.class.loader = example.ClassLoader example.ClassA
它工作并使用我的类加载器.但是,如果我这样做:
java -cp Example.jar -Djava.system.class.loader = example.ClassLoader example.ClassB
ClassB使用我的类加载器,但ClassA(由ClassB导入)使用默认的类加载器加载.
有没有办法强制Java总是使用我的类加载器(除非明确指定另一个类加载器)?
编辑:感谢下面的PaŭloEbermann的回答,我认为问题是我正在调用父类加载器(URLClassLoader)来加载我不需要触摸的类,并且那些加载的类设置为它的上下文类加载器,因此从它导入的类使用我的自定义加载器的父类加载器.(令人困惑,抱歉)现在我可以通过手动读取每个类来使它工作,但是它似乎是多余的,因为我直接复制了URLClassLoader的代码.有没有办法告诉父类加载器查找和定义类,但是将Class的上下文类加载器设置为自定义类?
是否有一个字符串
str.equals(str)是 False?
或者以另一种方式:
if(!str.equals(str)){
System.out.println("-1");
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以让println测试覆盖该代码行吗?