📄 adaptermaker.java
字号:
// Copyright (c) Corporation for National Research Initiativespackage org.python.compiler;import java.util.Hashtable;import java.util.Enumeration;import java.lang.reflect.Method;import java.io.*;public class AdapterMaker extends ProxyMaker{ public AdapterMaker(Class interfac) { super(interfac.getName()+"$Adapter", interfac); } public void build() throws Exception { names = new Hashtable(); //Class superclass = org.python.core.PyAdapter.class; int access = ClassFile.PUBLIC | ClassFile.SYNCHRONIZED; classfile = new ClassFile(myClass, "java/lang/Object", access); classfile.addInterface(mapClass(interfaces[0])); addMethods(interfaces[0], new Hashtable()); addConstructors(Object.class); doConstants(); } public static String makeAdapter(Class interfac, OutputStream ostream) throws Exception { AdapterMaker pm = new AdapterMaker(interfac); pm.build(); pm.classfile.write(ostream); return pm.myClass; } public void doConstants() throws Exception { for (Enumeration e=names.keys(); e.hasMoreElements();) { String name = (String)e.nextElement(); classfile.addField(name, "Lorg/python/core/PyObject;", ClassFile.PUBLIC); } } public void addMethod(Method method, int access) throws Exception { Class[] parameters = method.getParameterTypes(); Class ret = method.getReturnType(); String sig = makeSignature(parameters, ret); String name = method.getName(); //System.out.println(name+": "+sig); names.put(name, name); Code code = classfile.addMethod(name, sig, ClassFile.PUBLIC); code.aload(0); int pyfunc = code.pool.Fieldref(classfile.name, name, "Lorg/python/core/PyObject;"); code.getfield(pyfunc); code.dup(); Label returnNull = code.getLabel(); code.ifnull(returnNull); callMethod(code, name, parameters, ret, method.getExceptionTypes()); returnNull.setPosition(); doNullReturn(code, ret); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -