公開クラス/メソッドを限定する

例えば、次のようなクラスがあったとして、testメソッドだけを公開したいとします。

public class MyClass {
       public void test(){
	      System.out.println("test");
       }
       public String getName(){
	      return "foo";
       }
}

公開するメソッドを指定するには、JavaBeansのBeanInfoでメソッドディスクリプタを定義します。たとえば、MyClassクラスのメソッドディスクリプタを定義するには、MyClassBeanInfoクラスをjava.beans.SimpleBeanInfoクラスのサブクラスとして次のように定義します。

import java.beans.*;

public class MyClassBeanInfo extends SimpleBeanInfo {
    public MethodDescriptor[] getMethodDescriptors(){
	try{
	    return new MethodDescriptor[]{
		new MethodDescriptor(MyClass.class.getMethod("test", new Class[]{}))
	    };
	} catch (NoSuchMethodException e){
	    return new MethodDescriptor[]{};
	}
    }
}

pnuts.ext.LimitedClassesConfigurationオブジェクトに対して、registerClass()メソッドで、MyClassクラスを登録した上で、Context.setConfiguration()メソッドで設定すると、MyClassクラスのtestメソッドだけを呼び出すことができるコンテクストができます。

import pnuts.ext.LimitedClassesConfiguration;

Configuration conf = new JavaBeansConfiguration(false);
conf.registerClass(MyClass.class);
Context c = new Context();
c.setConfiguration(conf);

Pnuts.load(file, c);

pnuts.ext.LimitedClassesConfigurationオブジェクトが設定されたコンテクストでは、フィールドアクセスの式はBeanプロパティへのアクセスだと解釈されます。

myobj = MyClass()
myobj.test()  ===> "test" と表示
myobj.getName() ===> 例外
myobj.name    ===> "foo"