Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Author: Valerio Schiavoni <valerio.schiavoni@gmail.com>
  
  package org.objectweb.fractal.bf.connectors.rmi.asm;
  
  
Generate a subclass of java.rmi.server.UnicastRemoteObject that implements the specified interface and that delegates each call to a private field of the same type of the interface.
 
 public class UnicastRemoteObjectGenerator implements Opcodes {

 
 	private static final String DELEGATED_FIELD_NAME = "s";

Parameters:
the input class
 
 	public Class<?> generate(Class<?> unremotableInterfaze,
 			Class<?> remotableInterfaze) {
 		final String unremotableInterfazeInternalName = Type
 				.getInternalName(unremotableInterfaze);
 		final String remotableInterfazeInternalName = Type
 				.getInternalName(remotableInterfaze);
 
 		.finest("Internal type of delegate field: "
 				+ unremotableInterfazeInternalName);
 
 
 		final String generatedClassInternalName = remotableInterfazeInternalName
 				+ "Impl";
 		.finest("Generated class internal name: "
 				+ generatedClassInternalName);
 		cw.visit( + generatedClassInternalName,
 				null"java/rmi/server/UnicastRemoteObject",
 				new String[] { remotableInterfazeInternalName });
 
 		{
 
 					+ unremotableInterfazeInternalName + ";"nullnull);
 			fv.visitEnd();
 			.finest("Field name '" +  + "' of type "
 					+ unremotableInterfazeInternalName + " generated");
 		}
 
 		{
 			mv = cw.visitMethod("<init>""(L"
 					+ unremotableInterfazeInternalName + ";)V"null,
 					new String[] { "java/rmi/RemoteException" });
 			mv.visitCode();
 			Label l0 = new Label();
 			mv.visitLabel(l0);
 			mv.visitVarInsn(, 0);
 					"java/rmi/server/UnicastRemoteObject""<init>""()V");
 			Label l1 = new Label();
 			mv.visitLabel(l1);
 			mv.visitVarInsn(, 0);
 			mv.visitVarInsn(, 1);
 			mv.visitFieldInsn(generatedClassInternalName,
 							+ unremotableInterfazeInternalName + ";");
 			Label l2 = new Label();
 			mv.visitLabel(l2);
 			Label l3 = new Label();
 			mv.visitLabel(l3);
 			mv.visitLocalVariable("this""L" + generatedClassInternalName
 					+ ";"nulll0l3, 0);
 					+ unremotableInterfazeInternalName + ";"nulll0l3, 1);
 			mv.visitMaxs(2, 2);
 			mv.visitEnd();
 			.fine("1-Args constructor generated.");
 
 		}
 
 		StringBuffer argsAndReturn = null;
 		for (Method method : remotableInterfaze.getMethods()) {
			.finest("Generating method body for " + method.getName());
			argsAndReturn = new StringBuffer("(");
			Class<?>[] paramTypes = method.getParameterTypes();
			Class<?> returnType = method.getReturnType();
			int args = 0;
			for (Class<?> paramType : paramTypes) {
				argsAndReturn.append(Type.getType(paramType));
				args++;
			}
			.finest("Method has " + args + " arguments");
			argsAndReturn.append(")");
			argsAndReturn.append(Type.getType(returnType));
			mv = cw.visitMethod(.method.getName(),
					argsAndReturn.toString(), null,
					new String[] { "java/rmi/RemoteException" });
			Label l0 = new Label();
			mv.visitLabel(l0);
			mv.visitFieldInsn(generatedClassInternalName,
unremotableInterfazeInternalName + ";");
			// for every parameter of this method, push the actual argument on
			// the stack
			int i = 1;
			while (i <= args) {
				.finest("ALOAD index: " + i);
				i = i + 1;
			}
					unremotableInterfazeInternalNamemethod.getName(),
					argsAndReturn.toString());
			final String returnTypeValue = returnType.toString();
			if (returnTypeValue.equalsIgnoreCase("void")) {
				.finest("Method " + method
" returns void, using RETURN opcode");
else {
				.finest("Method " + method + " return " + returnTypeValue
", using ARETURN opcode");
			}
			Label l1 = new Label();
			mv.visitLabel(l1);
			mv.visitLocalVariable("this""L" + generatedClassInternalName
";"nulll0l1, 0);
			mv.visitMaxs(1, 1);
			.finer("Method " + method.toGenericString() + " generated");
		}
		byte[] bytecode = cw.toByteArray();
		RMIServiceClassLoader classloader = RMIServiceClassLoaderFactory
		.fine("RMIClassLoader retrieved, ref:" + classloader);
		final Class<?> definedClazz = classloader.defineClass(bytecode,
				generatedClassInternalName.replace("/""."));
		.finest("Class defined in RMIServiceClassLoader: " + definedClazz);
		return definedClazz;
	}
New to GrepCode? Check out our FAQ X