org.python.core.PyJavaInstance Maven / Gradle / Ivy
Go to download
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
// Copyright (c) Corporation for National Research Initiatives
package org.python.core;
import java.lang.reflect.Modifier;
/**
* A wrapper around a java instance.
*/
public class PyJavaInstance
extends PyInstance
implements java.io.Externalizable
{
public PyJavaInstance() {
}
public PyJavaInstance(PyJavaClass iclass) {
super(iclass, null);
}
public PyJavaInstance(Object proxy) {
super(PyJavaClass.lookup(proxy.getClass()), null);
javaProxy = proxy;
}
/**
* Implementation of the Externalizable interface.
* @param in the input stream.
* @exception java.io.IOException
* @exception ClassNotFoundException
*/
public void readExternal(java.io.ObjectInput in)
throws java.io.IOException, ClassNotFoundException
{
Object o = in.readObject();
javaProxy = o;
instclass = PyJavaClass.lookup(o.getClass());
}
/**
* Implementation of the Externalizable interface.
* @param out the output stream.
* @exception java.io.IOException
*/
public void writeExternal(java.io.ObjectOutput out)
throws java.io.IOException
{
//System.out.println("writing java instance");
out.writeObject(javaProxy);
}
public void __init__(PyObject[] args, String[] keywords) {
//javaProxies = new Object[1];
Class pc = instclass.proxyClass;
if (pc != null) {
int mods = pc.getModifiers();
if (Modifier.isInterface(mods)) {
throw Py.TypeError("can't instantiate interface ("+
instclass.__name__+")");
}
else if (Modifier.isAbstract(mods)) {
throw Py.TypeError("can't instantiate abstract class ("+
instclass.__name__+")");
}
}
PyReflectedConstructor init = ((PyJavaClass)instclass).__init__;
if (init == null) {
throw Py.TypeError("no public constructors for "+
instclass.__name__);
}
init.__call__(this, args, keywords);
}
protected void noField(String name, PyObject value) {
throw Py.TypeError("can't set arbitrary attribute in java instance: "+
name);
}
protected void unassignableField(String name, PyObject value) {
throw Py.TypeError("can't assign to this attribute in java " +
"instance: " + name);
}
public int hashCode() {
if (javaProxy != null) {
return javaProxy.hashCode();
} else {
return super.hashCode();
}
}
public PyObject _is(PyObject o) {
if (o instanceof PyJavaInstance) {
return javaProxy == ((PyJavaInstance)o).javaProxy
? Py.One : Py.Zero;
}
return Py.Zero;
}
public PyObject _isnot(PyObject o) {
return _is(o).__not__();
}
public int __cmp__(PyObject o) {
if (!(o instanceof PyJavaInstance))
return -2;
PyJavaInstance i = (PyJavaInstance)o;
if (javaProxy.equals(i.javaProxy))
return 0;
return -2;
}
public PyString __str__() {
return new PyString(javaProxy.toString());
}
public PyString __repr__() {
return __str__();
}
public void __delattr__(String attr) {
throw Py.TypeError("can't delete attr from java instance: "+attr);
}
}