我有以下xml文件:
<resources>
<resource id="res001">
<property name="propA" value="A" />
<property name="propB" value="B" />
</resource>
<resource id="res002">
<property name="propC" value="C" />
<property name="propD" value="D" />
</resource>
<resource id="res003">
<property name="propE" value="E" />
<property name="propF" value="F" />
</resource>
</resources>
Run Code Online (Sandbox Code Playgroud)
如何用Java/Xml做这样的事情:
Xml xml = new Xml("my.xml");
Resource res001 = xml.getResouceById("res003");
System.out.println("propF: " + res.getProperty("propF"));
Run Code Online (Sandbox Code Playgroud)
所以它打印:
F
Run Code Online (Sandbox Code Playgroud)
我尝试过使用XPathExpressionEngine的apache commons-configurations XMLConfiguration,但我无法让它工作.我用google搜索并找到了一些例子,但两者都不会起作用:(我正在寻找一个解决方案,我不需要遍历所有元素.
问候,亚历克斯
跟进这个问题的问题.
使用Gradle(build.gradle文件)构建时,如何为类存储方法参数名称?
根据Java 教程:
要将正式参数名称存储在特定的.class文件中,从而使Reflection API能够检索形式参数名称,请使用-parameters选项将源文件编译为javac编译器.
那么如何使用Gradle 将"-parameters"传递给javac编译器?
我在这里尝试了建议的解决方案,将下面的内容添加到我的build.gradle文件中,没有运气.
apply plugin: 'java'
compileJava {
options.compilerArgs << '-parameters'
options.fork = true
options.forkOptions.executable = 'javac'
}
Run Code Online (Sandbox Code Playgroud)
我正在使用eclipse,如果我启用它(在Window - > Preferences - > Java - > Compiler中),它可以正常工作.
Store information about method parameters (usable via reflection)
Run Code Online (Sandbox Code Playgroud)
但我宁愿让我的构建系统设置这个设置,所以我不依赖于eclipse,所以其他人可以使用我的buildt .jar文件.
我用:
我有这两个界面。一个是公共(A),另一个是包私有(AA)。A延伸AA。
package pkg.a;
@FunctionalInterface
public interface A extends AA {
}
Run Code Online (Sandbox Code Playgroud)
。
package pkg.a;
interface AA {
default void defaultM() {
System.out.println(m());
}
String m();
}
Run Code Online (Sandbox Code Playgroud)
我有此代码(在其他程序包中):
package pkg;
import java.util.Arrays;
import java.util.List;
import pkg.a.A;
public class Test {
public static void main(String[] args) {
List<A> list = Arrays.asList(() -> "imp1", () -> "imp2");
list.stream().forEach(a -> a.defaultM());
list.stream().forEach(A::defaultM);
}
}
Run Code Online (Sandbox Code Playgroud)
运行上面的代码时,list.stream().forEach(A::defaultM);引发以下异常。为什么?为什么lambda表达式可以,方法引用不能访问package-private接口中定义的方法?我正在Java版本1.8.0_191的Eclipse(版本:2018-12(4.10.0))中运行它。
imp1
imp2
Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
at java.lang.invoke.CallSite.makeSite(CallSite.java:341) …Run Code Online (Sandbox Code Playgroud) 我有以下界面.
PowerSwitch.java
public interface PowerSwitch {
public boolean powerOn();
public boolean powerOff();
public boolean isPowerOn();
}
Run Code Online (Sandbox Code Playgroud)
上面的接口应该包含可以从中派生出任何其他功能的最小方法集,以便尽可能简单地添加其他PowerSwitch实现.
我想在运行时向PowerSwitch接口添加功能(装饰器做什么),创建一个包含PowerSwitch实例组合的类并添加新方法,如下面的两个toggleOnOff()方法.这样我只需要实现两次切换方法,它将适用于所有PowerSwitch实现.
这被认为是一种好/坏的做法吗?如果不好,还有其他建议吗?
它并不真正符合装饰器模式,因为它增加了额外的方法.它是策略模式还是组合模式?或者它有另一个模式名称?有"界面装饰"这样的东西吗?
PowerSwitchDecorator.java
public class PowerSwitchDecorator {
private PowerSwitch ps;
public PowerSwitchDecorator(PowerSwitch ps) {
this.ps = ps;
}
public void toggleOnOff(int millis) throws InterruptedException{
powerOn();
Thread.sleep(millis);
powerOff();
}
public void toggleOnOff(){
powerOn();
powerOff();
}
public boolean powerOn() {
return ps.powerOn();
}
public boolean powerOff() {
return ps.powerOff();
}
public boolean isPowerOn() {
return ps.isPowerOn();
}
}
Run Code Online (Sandbox Code Playgroud) 当我在groovy控制台中执行以下代码时,我得到了一个groovy.lang.ReadOnlyPropertyException.这是预期的,因为属性x不应该可以改变(因为它ClassA是不可变的).
import groovy.transform.Immutable
@Immutable class ClassA {
int x
}
def a = new ClassA(x: 5);
a.x = 1
Run Code Online (Sandbox Code Playgroud)
但是如果将x变量的访问修饰符更改为private ,那么我可以在groovy控制台中执行它:
import groovy.transform.Immutable
@Immutable class ClassA {
private int x
}
def a = new ClassA(x: 5);
a.x = 1
println(a.x)
Run Code Online (Sandbox Code Playgroud)
为什么是这样?为什么添加的private访问修饰符变得ClassA可变?
请参阅以下两个示例.假设两个类都包含属于广泛使用的API库的公共方法.
AClass.java更容易编写(由于噪音较小,可能更容易阅读),但是当检测到错误时,堆栈跟踪中的第一个方法是内部方法(nullCheck(...)),异常消息不是指该方法.这会对用户造成不必要的混淆吗?我的意思是在用户思考的意义上:"它是一个抛出异常的内部方法,必须是库中的错误,而不是我的程序中的错误.什么是**无用的库......"
BClass.java编写(使用所有if语句)更加烦人,但是当检测到错误时,堆栈跟踪的第一行会确定首先检测到错误的API方法(由用户调用).这更有可能让用户思考:"我从我的代码中调用该方法,我传入的参数必定是错误的".
在公共API中检查参数的有效性时,哪种方法是抛出异常?或者这两个例子是否相同?
public class AClass {
public void publicApiMethod1(String a){
nullCheck(a, "a");
// do something...
}
public void publicApiMethod2(String a, String b, String c){
nullCheck(a, "a");
nullCheck(b, "b");
nullCheck(c, "c");
// do something...
}
private void nullCheck(Object a, String argName) {
if(a == null){
throw new NullPointerException("Null argument: " + argName);
}
}
}
public class BClass {
public void publicApiMethod1(String a){
if(a == null){
throw new NullPointerException("Null argument: 'a'");
}
// …Run Code Online (Sandbox Code Playgroud) java ×5
decorator ×1
eclipse ×1
gradle ×1
groovy ×1
java-8 ×1
methods ×1
parameters ×1
xml-parsing ×1