IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

JVM désactivé le loading automatique au démarrage


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut JVM désactivé le loading automatique au démarrage
    Quand on tape la commande java MaClass.java

    Automatiquement la JVM met environ 750 classes en mémoire pour pouvoir l'exécuter.

    Est-il possible que la JVM commence avec 0 classes et qu'elle les charge quand c'est nécessaire?

    Merci

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    C'est déjà le cas ; vois Consumer JRE: Leaner, Meaner Java Technology.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut la preuve que non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import java.lang.instrument.Instrumentation;
     
    public class SimpleMain {
    	public static void premain(String agentArguments, Instrumentation instrumentation) {	
    		System.out.println(instrumentation.getAllLoadedClasses().length);
    	}	
    }
    tu le met dans un jar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jar -cvf test.jar SimpleMain.class
    tu ajoute dans le manifest:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Premain-Class: SimpleMain
    tu exécute l'agent tout seul avec la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -javaagent:test.jar
    résultat 394 classes sont déjà lu dans la JVM

  4. #4
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 627
    Points : 15 788
    Points
    15 788
    Par défaut
    De quelles classe s'agit il? Normalement il devrait seulement s'agir des classes nécessaire au fonctionnement de ton application.

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est peut-être bête comme remarque, mais ce qu'il te retourne tient compte des classes chargées pour exécuter ton SimpleMain ? Si oui alors pour exécuter println() il doit charger quelques classes

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    il faudrait afficher les classes, mais vu que ta jvm est démarrée, t'as déjà toutes les classes associées au fonctionnement du GC qui doivent etre présente, toutes les classes liées à l'instrumentation, celles liées aux singletons System.out/err, indirectement celles liées aux classloader et l'exploration de jars, ...

    Sans compter que ca prend vraisemblablement en compte les classes privées et les inner classes, qui foisonnent vite.

    Quelque part, ce serait un peux comme s'étonner que pour charger les librairies et ton programme en C, le système a déjà fait 300 mallocs

    Faudrais voir aussi si ta JVM est récente

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    voilà chez moi la liste des classes chargées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    java.lang.ClassCastException
    sun.reflect.LangReflectAccess
    java.util.Collections$EmptySet
    sun.misc.SignalHandler
    java.util.LinkedHashMap$Entry
    java.util.Properties
    java.util.Arrays
    java.lang.Iterable
    java.util.Hashtable$EmptyEnumerator
    sun.reflect.Reflection
    sun.reflect.FieldAccessorImpl
    sun.misc.MetaIndex
    java.lang.Integer
    java.util.Set
    java.util.concurrent.atomic.AtomicReferenceFieldUpdater
    java.util.RandomAccess
    sun.nio.cs.UTF_8$Encoder
    java.lang.VirtualMachineError
    [Ljava.lang.VirtualMachineError;
    java.lang.Runtime
    sun.nio.cs.Unicode
    sun.security.provider.PolicyFile
    java.util.concurrent.locks.ReentrantLock$NonfairSync
    java.nio.charset.CharsetDecoder
    sun.nio.cs.HistoricallyNamedCharset
    java.io.ExpiringCache$Entry
    java.util.concurrent.ConcurrentMap
    java.security.BasicPermissionCollection
    java.util.Comparator
    java.io.Closeable
    java.lang.Thread
    [Ljava.lang.Thread;
    sun.nio.cs.UTF_8
    java.io.Serializable
    [Ljava.io.Serializable;
    java.util.AbstractList
    java.lang.instrument.Instrumentation
    java.lang.Terminator
    java.lang.ThreadLocal
    java.security.Principal
    [Ljava.security.Principal;
    sun.net.www.protocol.file.FileURLConnection
    sun.instrument.TransformerManager$TransformerInfo
    [Lsun.instrument.TransformerManager$TransformerInfo;
    java.util.Collections$SynchronizedMap
    java.lang.Exception
    sun.misc.Launcher$ExtClassLoader
    java.security.Permission
    java.net.UnknownContentHandler
    java.nio.charset.CoderResult
    sun.misc.URLClassPath$Loader
    sun.reflect.MethodAccessor
    java.net.URLConnection
    sun.jkernel.DownloadManager$1
    java.io.ObjectStreamField
    [Ljava.io.ObjectStreamField;
    java.lang.System
    java.util.concurrent.ConcurrentHashMap
    java.lang.OutOfMemoryError
    [Ljava.lang.OutOfMemoryError;
    java.util.BitSet
    java.io.FileDescriptor
    java.lang.Math
    java.util.Collections$EmptyList
    sun.reflect.ReflectionFactory
    java.security.Guard
    java.util.concurrent.ConcurrentHashMap$HashEntry
    [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
    java.lang.ref.Reference$Lock
    java.lang.ThreadGroup
    [Ljava.lang.ThreadGroup;
    java.lang.Byte
    sun.reflect.misc.ReflectUtil
    sun.net.www.ParseUtil
    sun.reflect.DelegatingClassLoader
    java.security.SecureClassLoader
    java.lang.Double
    java.lang.Readable
    sun.nio.cs.StandardCharsets
    java.lang.IncompatibleClassChangeError
    sun.misc.AtomicLong
    sun.reflect.ConstantPool
    java.io.FileInputStream
    java.nio.charset.CodingErrorAction
    java.util.StringTokenizer
    java.util.Stack
    java.util.Map$Entry
    [Ljava.util.Map$Entry;
    java.lang.Long
    java.nio.Bits
    java.io.FilterInputStream
    sun.reflect.MethodAccessorImpl
    java.lang.ref.ReferenceQueue$Null
    sun.reflect.UnsafeStaticFieldAccessorImpl
    java.util.concurrent.locks.AbstractQueuedSynchronizer
    java.lang.InternalError
    java.lang.StackTraceElement
    [Ljava.lang.StackTraceElement;
    java.util.Collections
    java.lang.Character
    sun.reflect.ConstructorAccessorImpl
    sun.misc.URLClassPath$FileLoader
    sun.misc.URLClassPath$FileLoader$1
    java.lang.NoSuchMethodError
    java.util.Vector
    java.lang.RuntimePermission
    java.lang.ref.SoftReference
    java.util.Dictionary
    sun.misc.OSEnvironment
    sun.misc.SharedSecrets
    java.util.HashMap
    sun.misc.SoftCache
    java.lang.Class$1
    java.lang.StackOverflowError
    sun.reflect.ReflectionFactory$GetReflectionFactoryAction
    java.security.ProtectionDomain
    java.util.List
    sun.instrument.InstrumentationImpl$1
    java.lang.LinkageError
    sun.net.www.MessageHeader
    java.lang.StringCoding
    java.lang.reflect.Member
    [Ljava.lang.reflect.Member;
    java.lang.reflect.Type
    [Ljava.lang.reflect.Type;
    sun.misc.Signal
    java.io.FileReader
    sun.misc.JavaLangAccess
    java.io.ExpiringCache
    java.io.OutputStream
    java.lang.ref.Finalizer$FinalizerThread
    sun.instrument.InstrumentationImpl
    java.net.URLClassLoader$7
    sun.misc.Launcher$AppClassLoader
    java.lang.ref.ReferenceQueue
    java.lang.Appendable
    sun.net.www.protocol.file.Handler
    java.io.PrintStream
    java.lang.ClassLoader$3
    sun.misc.JavaNetAccess
    java.security.AccessControlContext
    java.util.HashSet
    java.io.FileSystem
    java.nio.charset.CoderResult$Cache
    java.io.ExpiringCache$1
    java.lang.reflect.AccessibleObject
    [Ljava.lang.reflect.AccessibleObject;
    java.lang.Error
    [Ljava.lang.Error;
    java.lang.Boolean
    java.util.AbstractMap
    java.lang.RuntimeException
    java.net.URLStreamHandlerFactory
    java.util.Collection
    java.security.AccessController
    java.util.Hashtable$EmptyIterator
    java.lang.Number
    java.lang.ref.FinalReference
    java.io.BufferedInputStream
    java.lang.Runnable
    [Ljava.lang.Runnable;
    java.lang.ThreadLocal$ThreadLocalMap$Entry
    [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
    java.io.OutputStreamWriter
    java.lang.reflect.ReflectAccess
    java.security.BasicPermission
    java.security.PrivilegedActionException
    java.io.FileOutputStream
    sun.misc.URLClassPath$JarLoader
    java.util.Hashtable$Entry
    [Ljava.util.Hashtable$Entry;
    java.lang.ClassLoader
    java.lang.StringCoding$StringDecoder
    java.lang.Class$3
    java.lang.CharSequence
    [Ljava.lang.CharSequence;
    java.util.Enumeration
    java.util.concurrent.locks.ReentrantLock
    [Ljava.util.concurrent.locks.ReentrantLock;
    java.lang.Float
    sun.net.www.protocol.jar.Handler
    sun.nio.cs.FastCharsetProvider
    sun.reflect.NativeMethodAccessorImpl
    java.lang.ref.Reference$ReferenceHandler
    java.nio.CharBuffer
    java.lang.Object
    [Ljava.lang.Object;
    java.nio.ByteOrder
    sun.reflect.ReflectionFactory$1
    java.lang.Cloneable
    java.io.FilePermissionCollection
    java.net.URLClassLoader
    sun.jkernel.DownloadManager
    java.lang.ref.PhantomReference
    java.io.Writer
    java.lang.String
    [Ljava.lang.String;
    sun.misc.URLClassPath
    java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
    java.lang.Terminator$1
    sun.net.www.URLConnection
    java.io.FilePermission
    java.net.Parts
    sun.nio.ByteBuffered
    java.nio.HeapCharBuffer
    java.util.Hashtable
    java.lang.Compiler
    sun.misc.Launcher$ExtClassLoader$1
    test.SimpleMain
    java.security.PrivilegedAction
    sun.misc.NativeSignalHandler
    java.security.PermissionCollection
    java.io.InputStreamReader
    java.lang.StringBuffer
    java.net.URLStreamHandler
    java.lang.Compiler$1
    sun.nio.cs.StandardCharsets$Cache
    java.util.Collections$EmptyMap
    java.nio.ByteBuffer
    java.lang.StringCoding$StringEncoder
    java.security.Policy
    java.lang.ArithmeticException
    java.net.URLClassLoader$1
    java.lang.reflect.Method
    [Ljava.lang.reflect.Method;
    java.io.Reader
    java.lang.NoClassDefFoundError
    java.util.concurrent.locks.Lock
    [Ljava.util.concurrent.locks.Lock;
    java.lang.reflect.Array
    java.util.ArrayList
    java.lang.reflect.GenericDeclaration
    [Ljava.lang.reflect.GenericDeclaration;
    java.lang.Comparable
    [Ljava.lang.Comparable;
    java.lang.ThreadLocal$ThreadLocalMap
    java.lang.AbstractStringBuilder
    java.lang.ref.ReferenceQueue$Lock
    sun.security.action.GetPropertyAction
    java.lang.StringBuilder
    sun.nio.cs.StreamDecoder
    sun.security.util.Debug
    sun.nio.cs.StreamEncoder
    sun.reflect.MagicAccessorImpl
    java.security.UnresolvedPermission
    java.util.concurrent.locks.AbstractOwnableSynchronizer
    java.security.Permissions
    java.lang.Package
    sun.misc.AtomicLongCSImpl
    java.util.LinkedHashMap
    java.nio.charset.Charset
    java.util.concurrent.atomic.AtomicInteger
    java.lang.NullPointerException
    java.net.ContentHandler
    java.lang.reflect.AnnotatedElement
    [Ljava.lang.reflect.AnnotatedElement;
    java.io.FilePermission$1
    java.io.File
    [Ljava.io.File;
    java.io.BufferedOutputStream
    java.lang.reflect.Field
    [Ljava.lang.reflect.Field;
    java.lang.ClassNotFoundException
    java.lang.Throwable
    [Ljava.lang.Throwable;
    java.lang.StringValue
    java.security.CodeSource
    java.security.cert.Certificate
    [Ljava.security.cert.Certificate;
    java.nio.charset.CoderResult$2
    sun.reflect.FieldAccessor
    sun.reflect.DelegatingConstructorAccessorImpl
    java.util.HashMap$Entry
    [Ljava.util.HashMap$Entry;
    java.nio.charset.spi.CharsetProvider
    java.io.ObjectStreamClass
    java.lang.System$2
    sun.reflect.NativeConstructorAccessorImpl
    java.nio.Buffer
    sun.misc.Resource
    java.lang.ref.Finalizer
    sun.misc.Launcher$AppClassLoader$1
    sun.nio.cs.StandardCharsets$Classes
    java.lang.CharacterDataLatin1
    java.lang.ThreadDeath
    java.util.Map
    sun.misc.Unsafe
    java.lang.SystemClassLoaderAction
    java.io.UnixFileSystem
    java.util.concurrent.ConcurrentHashMap$Segment
    [Ljava.util.concurrent.ConcurrentHashMap$Segment;
    sun.nio.cs.UTF_8$Decoder
    java.util.Iterator
    java.net.URL
    [Ljava.net.URL;
    java.lang.reflect.Constructor
    [Ljava.lang.reflect.Constructor;
    java.security.Policy$UnsupportedEmptyCollection
    sun.jkernel.DownloadManager$2
    java.security.PrivilegedExceptionAction
    java.util.Collections$ReverseComparator
    java.lang.Short
    sun.util.PreHashedMap
    sun.reflect.UnsafeFieldAccessorImpl
    java.io.InputStream
    java.security.AllPermission
    java.io.BufferedWriter
    sun.misc.Launcher$Factory
    sun.misc.Launcher
    java.lang.ArrayStoreException
    java.lang.reflect.ReflectPermission
    java.io.Flushable
    java.util.AbstractSet
    java.io.FilterOutputStream
    java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
    java.lang.ref.WeakReference
    [Ljava.lang.ref.WeakReference;
    java.util.Locale
    java.lang.ref.Reference
    [Ljava.lang.ref.Reference;
    sun.reflect.DelegatingMethodAccessorImpl
    java.nio.charset.CoderResult$1
    java.nio.HeapByteBuffer
    java.lang.String$CaseInsensitiveComparator
    java.lang.Class
    [Ljava.lang.Class;
    sun.misc.VM
    sun.misc.URLClassPath$3
    sun.nio.cs.StandardCharsets$Aliases
    sun.reflect.ConstructorAccessor
    java.nio.charset.CharsetEncoder
    java.lang.reflect.Modifier
    java.util.AbstractCollection
    java.lang.ClassLoader$NativeLibrary
    sun.instrument.TransformerManager
    java.lang.Thread$UncaughtExceptionHandler
    [Ljava.lang.Thread$UncaughtExceptionHandler;
    java.io.BufferedReader
    sun.misc.Version
    java.lang.IllegalMonitorStateException
    java.util.concurrent.locks.ReentrantLock$Sync
    [Z
    [B
    [C
    [I
    [S
    [J
    [F
    [D
    Comme tu peux voir on y trouve:

    -les types de bases
    -l'instrumentation
    -les classloader
    -la sécurité car elle est utilisée par le classloader
    -les charset(faut bien savoir écrire)
    -des inner classes
    -quelques collections
    -tous les throwables déclarés par les classes utilisées
    -des classes liées aux threads et la synchro
    -les classes de sun


    rien d'anormal en somme

    J'ai 349 classes chargées. Si je fais un SimpleMain.class.forName("javaw.swing.JFrame"), je passe à 451, soit une centaines de classes chargées juste pour accéder à JFrame, et ca met un quart de poil de seconde

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut ok merci pour vos réponses
    Donc moi mon but c'est de faire de l'instrumentation de classe au moment ou elles sont chargées mais avant que j'ai le temps de les instrumenter, elles sont déjà chargées dans la JVM.

    Est ce que quelqu'un a une idée pour instrumenter les classes déjà chargées.

    l'étape d'après dans mon SimpleMain c'est :
    instrumentation.addTransformer(new SimpleTransformer( ) );

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Transformer une classe déjà lue
    Voila le ClassFileTransformer qui modifie toutes les classes qui sont lue par la suite.
    J'imagine que c'est l'instruction super() de mon constructeur qui fait chargé 350classes d'un coup.
    Enfin c'est inévitable donc il faut que je fasse un retransform sur les classes déjà lu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public class SimpleTransformer2 implements ClassFileTransformer {
     	Instrumentation instrum;
     
        public SimpleTransformer2(Instrumentation i) {
    		super();
    		instrum = i;
    		try{
    			Class[] cl = instrum.getAllLoadedClasses();
    			for(int a=0;a<cl.length;a++){
    				if(instrum.isModifiableClass(cl[a])){
    					instrum.retransformClasses(cl[a]);
    					System.out.println("modifiable :"+cl[a].getName());
    				}else{
    					System.out.println("pas modifiable :"+cl[a].getName());
    				}
    			}
    		}catch(Exception e){
    				e.printStackTrace();
    		}
        }
     
        public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {
    		System.out.println("Modifying: " + className);
    		byte[] result = bytes;
    		try {
                       [ . . mon instrumentation . . ]
    Donc évidement ca fonctionne pas. Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Modifying: " + className);
    au début de la méthode public byte[] transform( ... ) m'indique le nom des classes qui sont modifiées mais les classes déjà lues ne passe pas par cette méthode malgré le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    instrum.retransformClasses(cl[a]);
    fait dans le constructeur du ClassFileTransformer

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il ne manquerait pas un Can-Retransform-Classes ou un Can-Redefine-Classes dans ton manifest ???

    Source : http://javasearch.developpez.com/j2s...e-summary.html

    a++

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut très bonne remarque
    merci
    effectivement avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can-Retransform-Classes: true
    dans le manifest ca fonctionne mieux. Merci pour l'info

    Mais je n'arrive toujours pas a instrumenter les classes :
    java/lang/String
    java/lang/Integer
    etc ...

    Est ce qu'il y a un moyen?

    De plus, lors de mon premier test : instrum.isModifiableClass(cl[a])
    Les classes String etc ... se disent modifiable.

    Quelqu'un a une idée

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut j'arrive en modifier 16 sur 300
    grace à

    Can-Retransform-Classes: true

    dans le manifest je retransform 16 classes sur les 300 chargés au démarrage.

    peut être faut-il fait carrément faire un

    Instrumentation. redefineClasses(ClassDefinition[] definitions)

    le probleme c'est pour le ClassDefinition :

    public ClassDefinition(Class<?> theClass, byte[] theClassFile)


    - Creates a new ClassDefinition binding using the supplied class and class file bytes. Does not copy the supplied buffer, just captures a reference to it.

    Parameters:
    theClass - the Class that needs redefining
    theClassFile - the new class file bytes

    pour avoir le byte[] "theClassFile" il faut que j'appel la méthode transform qui me permet d'avoir un nouveau byte[] qui est en fait ma classe instrumenté.

    mais seulement le transform il faut lui donner tout ces paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException
    Et je sais pas comment faire

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Erreur
    désolé en fait le fait de rajouter l'option ne m'a rien fait gagner.

    J'ai commenté le code instrum.retransformClasses(cl[a]);

    et ca me donne le même résultat.
    Je n'ai toujours pas réussir à retransformer les classes déjà lu par la JVM.

    Pourtant je suis sure que c'est possible

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Proposition qui fonctionne presque
    voila ce que j'ai décidé de faire:
    au lieu de faire un retransform je fais un redefine.
    seulement je n'arrive pas lui envoyer le dernier paramètre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Class[] cl = instrum.getAllLoadedClasses();
    		int nb = 0;
    		for(int a=0;a<cl.length;a++){
    			if(instrum.isModifiableClass(cl[a])){
    				ClassDefinition cl2 = new ClassDefinition(cl[a],this.transform(ClassLoader.getSystemClassLoader(),cl[a].getName(), cl[a], cl[a].getProtectionDomain(), /* byte[] classfileBuffer comment je fais pour l'avoir???*/	));
    			}
    		}
    classfileBuffer - the input byte buffer in class file format - must not be modified

Discussions similaires

  1. Comment se connecter à InterNet automatiquement au démarrage de windows
    Par ninj@ dans le forum Dépannage et Assistance
    Réponses: 4
    Dernier message: 24/09/2006, 23h11
  2. Désactivé la saisi automatique pour un input
    Par Death83 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/08/2006, 15h29
  3. Réponses: 3
    Dernier message: 17/07/2006, 10h45
  4. Désactiver la touche MAJ au démarrage
    Par crapouye dans le forum Access
    Réponses: 6
    Dernier message: 06/12/2005, 14h49
  5. Comment désactiver les actions automatiques de Windows ?
    Par j-phi dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 06/01/2005, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo