2009-11-20 11 views
4

Est-ce que java.lang.Class est identique au fichier .class actuel? C'est-à-dire que le contenu est équivalent? Je voulais envoyer la socket .class, et je me demandais si au lieu d'essayer de trouver et de charger le fichier .class réel, si je pouvais simplement transmettre le java.lang.Class à la place?Java: fichier .class et java.lang.Class

Elaboration (lire si vous voulez plus d'informations)

Supposons que j'ai une classe Java appelée unObj. Lorsque ce fichier est compilé, un fichier appelé SomeObj.class sera généré.

Nous savons aussi que si je unObj comme un type, nous pourrions obtenir ce type java.lang.Class en faisant:

Class someObjClss = SomeObj.class; 

Nous savons java.lang.Class implémente Serializable, il peut donc être transmis.

Alors java.lang.Class est-il essentiellement la représentation de l'objet du fichier .class réel?

MISE À JOUR:

En supposant que j'ai transmis le fichier .class à un autre hôte, que je viens d'utiliser la méthode defineClass() pour construire la classe de retour?

Lien here

MAJ2:

Ce code fait des rendements InputStream null. Comment est-ce possible?

Class clazz = String.class; 

String className = clazz.getName(); System.out.println(className); 
URL url = clazz.getResource(className); 
if(url != null) 
{ 
    String pathName = url.getPath(); System.out.println(className); 
} 

InputStream inputStream = clazz.getResourceAsStream(className); 
if(inputStream != null) 
{ 
    System.out.println(inputStream.available()); 
} 

Répondre

5

Le numéro java.lang.Class est une classe Java. Il a son propre fichier .class :-) Une instance de java.lang.Class est utilisée pour représente classe de votre objet vous permettant d'effectuer certaines opérations (par exemple utiliser l'API de réflexion).

La sérialisation n'a rien à voir avec le fichier .class - c'est l'état de l'objet qui est sérialisé. Si vous deviez sérialiser Class<MyObject> et l'envoyer par le câble à une machine virtuelle Java qui n'a pas MyObject.class, elle ne saurait toujours pas ce qu'est MyObject.

Pourquoi avez-vous besoin de manuellement envoyer .class sur le fil pour commencer? Il y a des chargeurs de classe à distance pour faire face à cela.

+0

Je fais de la mobilité de code. J'ai besoin d'utiliser Reflection à l'autre bout pour charger dynamiquement la classe. – sivabudh

+1

Vous devrez alors envoyer le .class actuel et le charger à l'autre extrémité. Vous pouvez regarder à travers ceci: http://java.sun.com/developer/technicalArticles/Networking/classloaders/ – ChssPly76

+0

merci pour l'article. J'ai juste besoin de charger le fichier .class. Existe-t-il un moyen facile de trouver simplement le fichier .class à partir de mon application? – sivabudh

2

Une instance java.lang.Class est liée à un fichier ".class" correspondant, mais elles ne sont en aucun cas équivalentes.

L'instance java.lang.Class code la signature de type pour un fichier ".class", mais pas beaucoup plus. Ainsi, bien qu'un java.lang.Class puisse être sérialisé, cela ne vous fournit pas suffisamment pour permettre à une instance de la classe correspondante d'être instanciée à l'autre extrémité. Si vous voulez faire cela, vous devriez envoyer le fichier ".class".