ksino's diary

覚えたことを忘れないように、小さなことでも書いていく。

CDIでインジェクトするクラスを切り替える

やりたいこと

CDIでインジェクトするCDIビーンを切り替える方法にはいくつかありますが、ここでは@Alternativeとbeans.xmlを使います。

実装

CDIビーン

package jp.gr.java_conf.ksino.weldtest.cdibeans;

public interface Hero {
    public void showName();
}
package jp.gr.java_conf.ksino.weldtest.cdibeans;

import javax.enterprise.inject.Alternative;

@Alternative
public class Superman implements Hero {
    @Override
    public void showName() {
        System.out.println("スーパーマン");
    }
}
package jp.gr.java_conf.ksino.weldtest.cdibeans;

import javax.enterprise.inject.Alternative;

@Alternative
public class Batman implements Hero {

    @Override
    public void showName() {
        System.out.println("バットマン");
    }
}

インジェクションポイント

package jp.gr.java_conf.ksino.weldtest.logic;

import javax.inject.Inject;
import jp.gr.java_conf.ksino.weldtest.cdibeans.Hero;

public class Logic {
    @Inject
    private Hero hero;
    
    public void call() {
        hero.showName();
    }
}

META-INF/beans.xml

<beans>
    <alternatives>
        <class>jp.gr.java_conf.ksino.weldtest.cdibeans.Batman</class>
    </alternatives>
</beans>

実行結果

バットマン

JavaSE環境でCDIを試したい

やりたいこと

JavaSE環境でCDIを試したい。
どうやらWeldでできるようです。

環境

Oracle JDK 1.8.0_77(64bit)

準備(pom.xml)

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.3.3.Final</version>
    <scope>compile</scope>
</dependency>

コード

CDIビーン

package jp.gr.java_conf.ksino.weldtest.cdibeans;

public interface Hero {
    public void showName();
}
package jp.gr.java_conf.ksino.weldtest.cdibeans;

public class Superman implements Hero {

    @Override
    public void showName() {
        System.out.println("スーパーマン");
    }
}

インジェクションポイント

package jp.gr.java_conf.ksino.weldtest.logic;

import javax.inject.Inject;
import jp.gr.java_conf.ksino.weldtest.cdibeans.Hero;

public class Logic {
    @Inject
    private Hero hero;
    
    public void call() {
        hero.showName();
    }
}

実行コード

package jp.gr.java_conf.ksino.weldtest;

import javax.enterprise.inject.Instance;
import jp.gr.java_conf.ksino.weldtest.logic.Logic;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class Main {
    
    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        Instance<Logic> instance = container.select(Logic.class);
        Logic logic = instance.get();
        logic.call();
        weld.shutdown();
    }
    
}

beans.xml

クラスパス配下にMETA-INF/beans.xmlを配置する。
とりあえず空ファイルで良い。

型パラメータを取得する

やりたいこと

Genericsで以下のような型パラメータが指定されていた場合、型パラメータに指定されたクラス名(jp.gr.java_conf.ksino.generics.ABean)を取得したい。

public class CBean {
    private List<jp.gr.java_conf.ksino.generics.ABean> aBeans;

実装

ParameterizedTypeで取れます。

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class ParameterizedTypeTest {
    public static void main(String[] args) {
        try {
            Field field = CBean.class.getDeclaredField("aBeans");
            ParameterizedType pType = (ParameterizedType)field.getGenericType();
            Type[] typeArgs = pType.getActualTypeArguments();
            if (typeArgs.length > 0) {
                System.out.println(typeArgs[0].getTypeName());
            }

実行結果

jp.gr.java_conf.ksino.generics.ABean

apt-get update時にChromeが原因でエラー

sudo apt-get updateすると、以下のように怒られるようになってました。(いつからだろう?)

W: http://dl.google.com/linux/chrome/deb/dists/stable/Release の取得に失敗しました  期待されるエントリ 'main/binary-i386/Packages' が Release ファイル内に見つかりません (誤った sources.list エントリか、壊れたファイル)

E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

/etc/apt/sources.list.d/google-chrome.listを編集したら解決しました。

deb http://dl.google.com/linux/chrome/deb/ stable main

の部分を以下のように書き換えました。

deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main

Java 8でのファイル読み込み

こんなことができるようになっていた
Path path = Paths.get("test.txt");
try (BufferedReader reader = Files.newBufferedReader(path);) {
    reader.lines().forEach(s -> System.out.println(s));
} catch (IOException ex) {
    // 例外処理
}
test.txt
ロズベルグ
ハミルトン
ベッテル
実行結果
ロズベルグ
ハミルトン
ベッテル