レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

Java with CGLIB でMixinを使う

Rubyで利用できるMixinは、いわば多重継承の仕組みです。

CGLIBを使うことで、Javaでも疑似Mixinが使えます。

ただしインターフェイスベースでのMixinです。


以下のサンプルは、

HumanオブジェクトとEmployeeオブジェクトを合成して

両方のメソッドを持った新しいオブジェクトを作成しています。

合成後のオブジェクトには、

元オブジェクトのインターフェイスを介してアクセスできます。



Humanクラスには、Talkerインターフェイスが、

Employeeクラスには、Workerインターフェイスが、

それぞれ実装されていて、

結果のオブジェクトが両方のインターフェイス

キャストしてメソッドを実行しています。


Start.java

import net.sf.cglib.proxy.Mixin;

public class Start{
	public static void main(String args[]){
		Human h = new Human();
		Employee e = new Employee();
		
		Class[] delegates = new Class[]{ Talker.class, Worker.class};
		Object[] objects = new Object[]{h,e};
		Object mixin = Mixin.create(delegates,objects);

		((Talker)mixin).talk();
		((Worker)mixin).work();

	}
}

class Human implements Talker{
	public void talk(){
		System.out.println("hello!");
	}
}

class Employee implements Worker{
	public void work(){
		System.out.println("work!");
	}
}

interface Talker{
	public void talk();
}
interface Worker{
	public void work();
}


実行結果

C:\java\mixin>javac -cp cglib-nodep-2.1_3.jar Start.java

C:\java\mixin>java -cp .;cglib-nodep-2.1_3.jar Start
hello!
work!