Java ByteCode

A

andrewzzz

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
 
H

hiwa

andrewzzz said:
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);
}
}
------------------------------------------
 
E

EJP

andrewzzz said:
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)?

Why not just load the class at your end and serialize it to the other
end as is?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top