Como mudar já compilado.ficheiro da classe sem descompilação?

Quero mudar de roupa .método do ficheiro de classe. Instalei o descompilador Jd Eclipse e abri o .ficheiro da turma. Adicionei alguns códigos e guardei .ficheiro da turma. Mas, .o ficheiro da classe não está a mudar.

Não sei usar o descompilador. E se for possível, como mudar .ficheiro da classe sem usar o descompilador.

estou a usar o Ubuntu.

relativamente a

Editar:

Aqui está o meu código descompilado:

/*     */ package org.hibernate.id;
/*     */ 
/*     */ import java.io.Serializable;
/*     */ import java.sql.ResultSet;
/*     */ import java.sql.SQLException;
/*     */ import java.util.HashMap;
/*     */ import java.util.Properties;
/*     */ import org.apache.commons.logging.Log;
/*     */ import org.apache.commons.logging.LogFactory;
/*     */ import org.hibernate.HibernateException;
/*     */ import org.hibernate.MappingException;
/*     */ import org.hibernate.dialect.Dialect;
/*     */ import org.hibernate.type.Type;
/*     */ import org.hibernate.util.ReflectHelper;
/*     */ 
/*     */ public final class IdentifierGeneratorFactory
/*     */ {
/*  25 */   private static final Log log = LogFactory.getLog(IdentifierGeneratorFactory.class);
/*     */ 
/*  64 */   private static final HashMap GENERATORS = new HashMap();
/*     */ 
/*  66 */   public static final Serializable SHORT_CIRCUIT_INDICATOR = new Serializable() {
/*     */     public String toString() { return "SHORT_CIRCUIT_INDICATOR";
/*     */     }
/*  66 */   };
/*     */ 
/*  70 */   public static final Serializable POST_INSERT_INDICATOR = new Serializable() {
/*     */     public String toString() { return "POST_INSERT_INDICATOR";
/*     */     }
/*  70 */   };
/*     */ 
/*     */   public static Serializable getGeneratedIdentity(ResultSet rs, Type type)
/*     */     throws SQLException, HibernateException, IdentifierGenerationException
/*     */   {
/*  32 */     if (!(rs.next())) {
/*  33 */       throw new HibernateException("The database returned no natively generated identity value");
/*     */     }
/*  35 */     Serializable id = get(rs, type);
/*     */ 
/*  37 */     if (log.isDebugEnabled()) log.debug("Natively generated identity: " + id);
/*  38 */     return id;
/*     */   }
/*     */ 
/*     */   public static Serializable get(ResultSet rs, Type type)
/*     */     throws SQLException, IdentifierGenerationException
/*     */   {
/*  45 */     Class clazz = type.getReturnedClass();
/*  46 */     if (clazz == Long.class) {
/*  47 */       return new Long(rs.getLong(1));
/*     */     }
/*  49 */     if (clazz == Integer.class) {
/*  50 */       return new Integer(rs.getInt(1));
/*     */     }
/*  52 */     if (clazz == Short.class) {
/*  53 */       return new Short(rs.getShort(1));
/*     */     }
/*  55 */     if (clazz == String.class) {
/*  56 */       return rs.getString(1);
/*     */     }
                if(clazz == java.math.BigDecimal.class){
                    return rs.getBigDecimal(1);
                }
/*     */ 
/*  59 */     throw new IdentifierGenerationException("this id generator generates long, integer, short or string78");
/*     */   }
/*     */ 
/*     */   public static IdentifierGenerator create(String strategy, Type type, Properties params, Dialect dialect)
/*     */     throws MappingException
/*     */   {
/*     */     try
/*     */     {
/*  92 */       Class clazz = getIdentifierGeneratorClass(strategy, dialect);
/*  93 */       IdentifierGenerator idgen = (IdentifierGenerator)clazz.newInstance();
/*  94 */       if (idgen instanceof Configurable) ((Configurable)idgen).configure(type, params, dialect);
/*  95 */       return idgen;
/*     */     }
/*     */     catch (Exception e) {
/*  98 */       throw new MappingException("could not instantiate id generator", e);
/*     */     }
/*     */   }
/*     */ 
/*     */   public static Class getIdentifierGeneratorClass(String strategy, Dialect dialect) {
/* 103 */     Class clazz = (Class)GENERATORS.get(strategy);
/* 104 */     if ("native".equals(strategy)) clazz = dialect.getNativeIdentifierGeneratorClass();
/*     */     try {
/* 106 */       if (clazz == null) clazz = ReflectHelper.classForName(strategy);
/*     */     }
/*     */     catch (ClassNotFoundException e) {
/* 109 */       throw new MappingException("could not interpret id generator strategy: " + strategy);
/*     */     }
/* 111 */     return clazz;
/*     */   }
/*     */ 
/*     */   public static Number createNumber(long value, Class clazz) throws IdentifierGenerationException {
/* 115 */     if (clazz == Long.class) {
/* 116 */       return new Long(value);
/*     */     }
/* 118 */     if (clazz == Integer.class) {
/* 119 */       return new Integer((int)value);
/*     */     }
/* 121 */     if (clazz == Short.class) {
/* 122 */       return new Short((short)(int)value);
/*     */     }

/*     */ 
/* 125 */     throw new IdentifierGenerationException("this id generator generates long, integer, short");
/*     */   }
/*     */ 
/*     */   static
/*     */   {
/*  75 */     GENERATORS.put("uuid", UUIDHexGenerator.class);
    GENERATORS.put("hilo", TableHiLoGenerator.class);
     GENERATORS.put("assigned", Assigned.class);
     GENERATORS.put("identity", IdentityGenerator.class);
    GENERATORS.put("select", SelectGenerator.class);
    GENERATORS.put("sequence", SequenceGenerator.class);
     GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);
    GENERATORS.put("increment", IncrementGenerator.class);
   GENERATORS.put("foreign", ForeignGenerator.class);
     GENERATORS.put("guid", GUIDGenerator.class);
     GENERATORS.put("uuid.hex", UUIDHexGenerator.class);
     GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);
   }
 }
Author: Breed Hansen, 2012-12-28

9 answers

Pode seguir estes passos para modificar a sua classe java:

  1. Descompila o .class file as you have done and save it as .java
  2. Crie um projecto no Eclipse com o ficheiro java, o JAR original como biblioteca, e todas as suas dependências
  3. muda o .java e compile
  4. modificar .class file and put it again inside the original FRASCO.
 41
Author: izaera, 2012-12-29 18:49:20

Usar um editor bytecode, como:

Http://set.ee/jbe/

Tenha cuidado porque você precisa de um conhecimento muito bom do bytecode Java.

Você também pode mudar a classe em tempo de execução com tecelagem bytecode (como AspectJ).

 14
Author: Lakatos Gyula, 2018-03-08 07:59:18
Adicionei alguns códigos e guardei .ficheiro da turma.

O que você vê no descompilador de EClipse JD é a representação descompilada do código de byte no .ficheiro da turma. Mesmo que você mude o texto, ele não afetará o código byte.

 3
Author: Nikolay Kuznetsov, 2012-12-28 11:52:07

Quando você descompila e muda o código, você tem que ir para a pasta raiz do seu projeto eclipse e verificar a sua classe na pasta bin que está no mesmo nível que src. em seguida, abra o frasco original com a ferramenta zip ( 7zip é bom para isso ) e coloque a classe modificada no mesmo pacote dentro do frasco.

 2
Author: abk, 2013-06-07 13:14:28

Use java assist Java library para manipular o bytecode Java (.ficheiro de classe) de um pedido.

-> Primavera, hibernar, EJB usando isto para implementação por procuração

-> podemos manipular bytecode para fazer alguma análise de programa

- > podemos usar o Javassist para implementar um cache transparente para os valores de retorno do método, interceptando todas as invocações do método e apenas delegando na super implementação na primeira invocação.

 1
Author: Opster Elasticsearch Pro-Vijay, 2017-03-17 06:38:52

Pode usar qualquer descompilador para primeiro descompilar o ficheiro.

Uma vez eu tinha enfrentado um problema simillar onde eu não tinha o código fonte da aplicação e tinha que fazer uma mudança muito pequena em um arquivo.

Abaixo está o que eu fiz:

  1. Extraído o ficheiro da classe do frasco

  2. Abriu-o em um descompilador (eu uso GUI JD, você pode obtê-lo facilmente a partir de muitos recursos na internet) Você pode baixá-lo de Aqui.

  3. Você pode realmente ver todos os arquivos em um jar usando GUI JD.

  4. fiz alterações no ficheiro que eu queria e copiei todo o código desse ficheiro
  5. criou um novo projecto no eclipse com apenas esta classe ( com a mesma estrutura de pacotes que no jar ), desde o jar original como biblioteca e todas as outras dependências.
  6. compilou a classe, injectou a .ficheiro da classe de volta para o jar da pasta bin da minha workspace
  7. Testei a minha mudança, celebrei-a bebendo uma chávena de café.
 1
Author: user2280507, 2017-06-08 08:56:00

Você pode alterar o código quando você descompilado, mas ela tem que ser recompilado para um class arquivo, o decompiler saídas java código, isso tem que ser recompilado com o mesmo classpath como o original jar/class arquivo

 0
Author: epoch, 2012-12-28 11:51:52
Em algum momento precisamos compilar um único arquivo de milhares de arquivos para corrigir o problema. Em tal caso, pode-se criar a mesma estrutura de pastas como o caminho de classe, descompilar o arquivo em java ou copiar o arquivo java a partir do código fonte. Faça as alterações necessárias, compile um arquivo particular na classe com todas as dependências/classes no lugar e, finalmente, substitua o arquivo da classe. Finalmente, reiniciar o recipiente. Quando a guerra explodir, o ficheiro não será substituído.
 0
Author: Harish Arora, 2017-08-23 05:28:57
Até onde consegui descobrir, não há uma maneira simples de o fazer. A maneira mais fácil é não converter o arquivo class em um executável, mas sim envolver um lançador executável em torno do arquivo class. Isto é, criar um arquivo executável (talvez um arquivo de scripts baseado no sistema operacional, executável) que simplesmente invoca a classe Java através da linha de comandos.

Se você quer realmente ter um programa que o faz, você deve olhar para alguns dos instaladores automatizados fora la.

Eis uma maneira que encontrei:
[code]
import java.io.*;
import java.util.jar.*;

class OnlyExt implements FilenameFilter{
String ext;
public OnlyExt(String ext){
this.ext="." + ext;
}

@Override
public boolean accept(File dir,String name){
return name.endsWith(ext);
}
}

public class ExeCreator {
public static int buffer = 10240;
protected void create(File exefile, File[] listFiles) {
try {
byte b[] = new byte[buffer];
FileOutputStream fout = new FileOutputStream(exefile);
JarOutputStream out = new JarOutputStream(fout, new Manifest());
for (int i = 0; i < listFiles.length; i++) {
if (listFiles[i] == null || !listFiles[i].exists()|| listFiles[i].isDirectory())
System.out.println("Adding " + listFiles[i].getName());
JarEntry addFiles = new JarEntry(listFiles[i].getName());
addFiles.setTime(listFiles[i].lastModified());
out.putNextEntry(addFiles);

FileInputStream fin = new FileInputStream(listFiles[i]);
while (true) {
int len = fin.read(b, 0, b.length);
if (len <= 0)
break;
out.write(b, 0, len);
}
fin.close();
}
out.close();
fout.close();
System.out.println("Jar File is created successfully.");
} catch (Exception ex) {}
}

public static void main(String[]args){
ExeCreator exe=new ExeCreator();
FilenameFilter ff = new OnlyExt("class");
File folder = new File("./examples");
File[] files = folder.listFiles(ff);
File file=new File("examples.exe");
exe.create(file, files);
}

}


[/code]`
 -1
Author: kytuni, 2014-06-29 22:52:27