小编etx*_*lpo的帖子

如何用java从xml文件中读取属性?

我有以下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搜索并找到了一些例子,但两者都不会起作用:(我正在寻找一个解决方案,我不需要遍历所有元素.

问候,亚历克斯

java xml-parsing

14
推荐指数
2
解决办法
3万
查看次数

使用Gradle/Java8构建时,为某些类存储方法参数名称

跟进这个问题的问题.

使用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文件.

我用:

  • Eclipse 4.4.2
  • Gradle IDE 3.6.4(eclipse插件)

java parameters methods gradle java-8

12
推荐指数
1
解决办法
2427
查看次数

为什么此方法引用在运行时失败,但没有相应的lambda调用失败?

我有这两个界面。一个是公共(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)

java eclipse

11
推荐指数
1
解决办法
87
查看次数

这是装饰者还是策略模式,或者两者都不是?

我有以下界面.

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)

java design-patterns decorator strategy-pattern

8
推荐指数
2
解决办法
733
查看次数

@Immutable如何在groovy中工作?

当我在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可变?

groovy

6
推荐指数
1
解决办法
169
查看次数

如果非法参数传递给API方法,何时抛出异常?

请参阅以下两个示例.假设两个类都包含属于广泛使用的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 exception-handling

4
推荐指数
1
解决办法
1053
查看次数