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(); } }
実行結果
バットマン
JavaSE環境でCDIを試したい
やりたいこと
JavaSE環境でCDIを試したい。
どうやらWeldでできるようです。
準備(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(); } }
型パラメータを取得する
やりたいこと
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
ロズベルグ ハミルトン ベッテル
実行結果
ロズベルグ ハミルトン ベッテル
文字列の結合(String#join)
Java 8でこんなことができるようになってた。
String[] array = {"a", "bc", "def", "ghi"}; System.out.println(String.join("_", array));
実行結果
a_bc_def_ghi