Re: Java ByteCode
andrewzzz wrote:
Hi guys,
I have some questions about java bytecode..
1-java bytecode is cointained in the .Class file,that is autogenerated
by Ecliplse(the ide I'm using) or by javac.
I need to extract the bytecode from a .class file,and actually I'm
using this piece of code :
//leggo il codice dal file java e lo memorizzo come byte
file=new File(path);
InputStream is;
try {
is = new FileInputStream(file);
long length = file.length();// Get the size of the file
// You cannot create an array using a long type.
// It needs to be an int type.
// Before converting to an int type, check
// to ensure that file is not larger than Integer.MAX_VALUE.
if (length > Integer.MAX_VALUE) {
// File is too large
}
// Create the byte array to hold the data
dati = new byte[(int)length];
// Read in the bytes
int offset = 0;
int numRead = 0;
while (offset < dati.length
&& (numRead=is.read(dati, offset,dati.length-offset))>=0) {
offset += numRead;
}
// Ensure all the bytes have been read in
if (offset < dati.length) {
throw new IOException("Could not completely read file
"+file.getName());
}
// Close the input stream and return bytes
is.close();
Is it right?(I think so..)
2-Then my program will serialize and send through TCP socket the bytes
loaded from the .class.The receiver need to create an instance of the
.class received...how do I do this...(note that I know the name of the
class)?
Thanks a lot guys...BYE!--JAVA ROCKS
For this example program, use a simple single-class
application class with main() method:
--------------------------------------------------------------------------------------------
import java.io.*;
import java.lang.reflect.*;
public class ClassFileRead{
public static void main(String[] args){
String cname = "Rex"; // class name
String path;
InputStream is;
byte[] dati;
File file;
ThrowAwayClassLoader cder;
Class clas;
int flen;
dati = null;
if (args.length > 0){
cname = args[0];
}
path = cname + ".class";
try {
file = new File(path);
is = new FileInputStream(path);
long length = file.length();
if (length > Integer.MAX_VALUE) {
System.out.println("File too large, exitting...");
System.exit(1);
}
flen = (int)length;
dati = new byte[flen];
int numRead = is.read(dati);
if (numRead != flen){
System.out.println("read failed, exitting...");
System.exit(1);
}
is.close();
}
catch (Exception e){
e.printStackTrace();
}
try{
cder = new ThrowAwayClassLoader(cname, dati);
clas = cder.getTheClass();
Object ob = clas.newInstance();
Method meth = clas.getMethod("main", String[].class);
meth.invoke(ob, (Object)null);
}
catch (Exception e){
e.printStackTrace();
}
}
}
class ThrowAwayClassLoader extends ClassLoader{
String className;
byte[] classData;
public ThrowAwayClassLoader(String nam, byte[] ba){
className = nam;
classData = ba;
}
public Class getTheClass() {
return defineClass(className, classData, 0, classData.length);
}
}
------------------------------------------