ramprasadr
asked on
private static void main ?
How does a main method work perfectly as a private function ?
Regards,
Ram
Regards,
Ram
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Hi JIM,
Reflection package is listing only public methods.
ravindra,
Prior to Java 1.2 you were correct. However, 1.2 added "reflective access control". The reflection Field, Method, and Constructor objects now extend AccessibleObject through which even private members may now be declared to be accessible. There is also a ReflectPermission class that will accomplish the same thing. Here is an example of it's use:
---------- ReflectObject.java ----------
import java.io.*;
import java.util.Vector;
import java.lang.reflect.*;
public class ReflectObject {
private byte b = 1;
private short sh = 2;
private int i = 3;
private long l = 4;
private String s = "I'm a string";
private char ch = 'c';
private Vector v = new Vector();
private Object[] a = new Object[2];
public ReflectObject() {
a[0] = new String("answer to life, the universe, and everything");
a[1] = new Integer(42);
v.add(a[0]);
v.add(a[1]);
}
private static void writeObject(Writer w, Object o, String id) throws IOException {
if (o == null) {
w.write("null object encountered\n");
return;
}
Class clazz = o.getClass();
Field[] fields = clazz.getDeclaredFields();
AccessibleObject.setAccess ible(field s, true);
String name = clazz.getName();
w.write(clazz.getName() + " " + id +" = { ");
for (int i = 0; i < fields.length; i++) {
try {
String fieldName = fields[i].getName();
Class fieldClass = fields[i].getType();
String fieldType = fieldClass.getName();
String fieldValue;
if (i > 0) {
w.write(", ");
}
if (fieldClass.isPrimitive()) {
if (fieldType.equals("int"))
fieldValue = String.valueOf(fields[i].g etInt(o));
else if (fieldType.equals("short") ) {
fieldValue = String.valueOf(fields[i].g etShort(o) );
} else if (fieldType.equals("boolean ")) {
fieldValue = String.valueOf(fields[i].g etBoolean( o));
} else if (fieldType.equals("char")) {
fieldValue = String.valueOf(fields[i].g etChar(o)) ;
} else if (fieldType.equals("byte")) {
fieldValue = String.valueOf(fields[i].g etByte(o)) ;
} else if (fieldType.equals("long")) {
fieldValue = String.valueOf(fields[i].g etLong(o)) ;
} else if (fieldType.equals("float") ) {
fieldValue = String.valueOf(fields[i].g etFloat(o) );
} else if (fieldType.equals("double" )) {
fieldValue = String.valueOf(fields[i].g etDouble(o ));
} else if (fieldType.equals("void")) {
fieldValue = new String("(void values unavailable)");
} else {
fieldValue = new String(" no value or type available ");
}
w.write(fieldName + "=" + fieldValue);
} else if (fieldType.equalsIgnoreCas e("java.la ng.String" )) {
w.write(fieldName + "='" + fields[i].get(o) + "'");
} else {
// contained object
writeObject(w, fields[i].get(o), fieldName);
}
} catch (IllegalAccessException iae) {
iae.printStackTrace();
break;
}
}
w.write(" }\n");
}
public static void write(Writer w, Object o, String id) {
try {
if (o == null) {
w.write("null object supplied\n");
return;
}
writeObject(w, o, id);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
public static void main(String[] args) {
OutputStreamWriter w = new OutputStreamWriter(System. out);
Object o = new ReflectObject();
System.out.println(o);
write(w, o, "o");
try {
w.flush();
} catch (Exception e) {
}
}
}
---------- end ----------
Compile and invoke this on itself: "java ReflectObject ReflectObject" or any other class that contains private members. You will see that it is able to access private members of the class.
Best regards,
Jim Cakalic
Prior to Java 1.2 you were correct. However, 1.2 added "reflective access control". The reflection Field, Method, and Constructor objects now extend AccessibleObject through which even private members may now be declared to be accessible. There is also a ReflectPermission class that will accomplish the same thing. Here is an example of it's use:
---------- ReflectObject.java ----------
import java.io.*;
import java.util.Vector;
import java.lang.reflect.*;
public class ReflectObject {
private byte b = 1;
private short sh = 2;
private int i = 3;
private long l = 4;
private String s = "I'm a string";
private char ch = 'c';
private Vector v = new Vector();
private Object[] a = new Object[2];
public ReflectObject() {
a[0] = new String("answer to life, the universe, and everything");
a[1] = new Integer(42);
v.add(a[0]);
v.add(a[1]);
}
private static void writeObject(Writer w, Object o, String id) throws IOException {
if (o == null) {
w.write("null object encountered\n");
return;
}
Class clazz = o.getClass();
Field[] fields = clazz.getDeclaredFields();
AccessibleObject.setAccess
String name = clazz.getName();
w.write(clazz.getName() + " " + id +" = { ");
for (int i = 0; i < fields.length; i++) {
try {
String fieldName = fields[i].getName();
Class fieldClass = fields[i].getType();
String fieldType = fieldClass.getName();
String fieldValue;
if (i > 0) {
w.write(", ");
}
if (fieldClass.isPrimitive())
if (fieldType.equals("int"))
fieldValue = String.valueOf(fields[i].g
else if (fieldType.equals("short")
fieldValue = String.valueOf(fields[i].g
} else if (fieldType.equals("boolean
fieldValue = String.valueOf(fields[i].g
} else if (fieldType.equals("char"))
fieldValue = String.valueOf(fields[i].g
} else if (fieldType.equals("byte"))
fieldValue = String.valueOf(fields[i].g
} else if (fieldType.equals("long"))
fieldValue = String.valueOf(fields[i].g
} else if (fieldType.equals("float")
fieldValue = String.valueOf(fields[i].g
} else if (fieldType.equals("double"
fieldValue = String.valueOf(fields[i].g
} else if (fieldType.equals("void"))
fieldValue = new String("(void values unavailable)");
} else {
fieldValue = new String(" no value or type available ");
}
w.write(fieldName + "=" + fieldValue);
} else if (fieldType.equalsIgnoreCas
w.write(fieldName + "='" + fields[i].get(o) + "'");
} else {
// contained object
writeObject(w, fields[i].get(o), fieldName);
}
} catch (IllegalAccessException iae) {
iae.printStackTrace();
break;
}
}
w.write(" }\n");
}
public static void write(Writer w, Object o, String id) {
try {
if (o == null) {
w.write("null object supplied\n");
return;
}
writeObject(w, o, id);
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
public static void main(String[] args) {
OutputStreamWriter w = new OutputStreamWriter(System.
Object o = new ReflectObject();
System.out.println(o);
write(w, o, "o");
try {
w.flush();
} catch (Exception e) {
}
}
}
---------- end ----------
Compile and invoke this on itself: "java ReflectObject ReflectObject" or any other class that contains private members. You will see that it is able to access private members of the class.
Best regards,
Jim Cakalic
ASKER
Thank you very much, Jim. I was asked this question in an interview.
When the virtual machine loads your class to execute as an application it will not find the main function in the external interface.