Ref.: Ref.: Non-static variable this cannot

Como resolvo isso?

/*
 * ManutencaoTabela.java
 *
 * Created on 23 de Junho de 2007, 21:01
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package manutencoes;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedHashMap;
import javax.swing.JOptionPane;

/**
 *
 * @author Paulo Roberto
 */
public class ManutencaoTabela_1 {
    
    private ManutencaoTabela_1() {
        //
    }
    
    public static void IncluiRegistro(final Object Tabela, final Connection Conexao) {
        this.ExecutaTransacao(this.PreparaInclusaoRegistro(Tabela), this.getAtributosClasse(Tabela), Conexao);
    }
    
    protected static void ExecutaTransacao(final String strSQL, final LinkedHashMap lhmAtributosClasse, final Connection Conexao) {
        String strNomeAtributo = new String();
        
        try {
            //Prepara transação
            PreparedStatement pstmt = Conexao.prepareStatement(strSQL);
            
            //Atribui valores aos parâmetros
            int i = 0;
            
            //Inclusão
            if (strSQL.indexOf("INSERT INTO") > -1) {
                //Parêmetros da contexto da QUERY
                for (Iterator it = lhmAtributosClasse.keySet().iterator(); it.hasNext(); ) {
                    strNomeAtributo = it.next().toString();
                    
                    if (!strNomeAtributo.equals("NomeTabela") && !strNomeAtributo.substring(strNomeAtributo.length()-3, strNomeAtributo.length()).equals("Chv")) {
                        i++;
                        pstmt = TrataParametro(pstmt, i, lhmAtributosClasse.get(strNomeAtributo));
//                        System.out.println("Nome da Coluna: " + pstmt.getMetaData().getColumnName(i));
                    }
                }
            } else if (strSQL.indexOf("UPDATE") > -1) {
                //Parêmetros da contexto da QUERY
                for (Iterator it = lhmAtributosClasse.keySet().iterator(); it.hasNext(); ) {
                    strNomeAtributo = it.next().toString();
                    
                    if (!strNomeAtributo.equals("NomeTabela") && !strNomeAtributo.substring(strNomeAtributo.length()-3, strNomeAtributo.length()).equals("Chv")) {
                        i++;
                        pstmt = TrataParametro(pstmt, i, lhmAtributosClasse.get(strNomeAtributo));
//                        System.out.println("Nome da Coluna: " + pstmt.getMetaData().getColumnName(i));
                    }
                }
                
                //Parêmetros da cláusula WHERE
                for (Iterator it = lhmAtributosClasse.keySet().iterator(); it.hasNext(); ) {
                    strNomeAtributo = it.next().toString();
                    
                    if (strNomeAtributo.substring(strNomeAtributo.length()-3, strNomeAtributo.length()).equals("Chv")) {
                        i++;
                        pstmt = TrataParametro(pstmt, i, lhmAtributosClasse.get(strNomeAtributo));
//                        System.out.println("Nome da Coluna: " + pstmt.getMetaData().getColumnName(i));
                    }
                }
            } else if (strSQL.indexOf("DELETE FROM") > -1) {
                //Parêmetros da cláusula WHERE
                for (Iterator it = lhmAtributosClasse.keySet().iterator(); it.hasNext(); ) {
                    strNomeAtributo = it.next().toString();
                    
                    if (strNomeAtributo.substring(strNomeAtributo.length()-3, strNomeAtributo.length()).equals("Chv")) {
                        i++;
                        pstmt = TrataParametro(pstmt, i, lhmAtributosClasse.get(strNomeAtributo));
//                        System.out.println("Nome da Coluna: " + pstmt.getMetaData().getColumnName(i));
                    }
                }
            }
            
//////////            //Mostra parâmetros e seus respectivos valores - (Esta PORRA!, não Funciona com alguns Drivers. Inclusive este!)
            System.out.println("Parâmetros ...");
            
//////////            ParameterMetaData pmd = pstmt.getParameterMetaData();
//////////
//////////            for (int i2 = 1; i2 < pmd.getParameterCount(); i2++) {
//////////                System.out.println("Parameter number " + i2);
//////////                System.out.println("  Class name is " + pmd.getParameterClassName(i2));
//////////                // Note: Mode relates to input, output or inout
//////////                System.out.println("  Mode is " + pmd.getParameterClassName(i2));
//////////                System.out.println("  Type is " + pmd.getParameterType(i2));
//////////                System.out.println("  Type name is " + pmd.getParameterTypeName(i2));
//////////                System.out.println("  Precision is " + pmd.getPrecision(i2));
//////////                System.out.println("  Scale is " + pmd.getScale(i2));
//////////                System.out.println("  Nullable? is " + pmd.isNullable(i2));
//////////                System.out.println("  Signed? is " + pmd.isSigned(i2));
//////////            }
            
            //Mostra String SQL
            System.out.println(strSQL);
            
            //Executa  procedimento
            pstmt.executeUpdate();
            
            //Fecha procedimento
            pstmt.close();
            
//            //Fecha conexão
//            this.Conexao.close();
        } catch (SQLException errorSQL) {
            JOptionPane.showMessageDialog(null, errorSQL.getMessage(), "Erro SQL", JOptionPane.ERROR_MESSAGE);
            errorSQL.printStackTrace();
        }
    }
    
    protected static String PreparaInclusaoRegistro(final Object Tabela) {
        LinkedHashMap lhmAtributosClasse = new LinkedHashMap();
        StringBuffer sbSQL = new StringBuffer();
        String strNomeAtributo = new String();
        
        //
        lhmAtributosClasse = this.getAtributosClasse(Tabela);
        
        //Inclui Registro
        sbSQL.append("INSERT INTO ").append(lhmAtributosClasse.get("NomeTabela") + " ");
        sbSQL.append("(");
        
        //Lista as entradas (Campos da Tabela)
        for (Iterator it = lhmAtributosClasse.keySet().iterator(); it.hasNext(); ) {
            strNomeAtributo = it.next().toString();
            
            if (!strNomeAtributo.equals("NomeTabela") && !strNomeAtributo.substring(strNomeAtributo.length()-3, strNomeAtributo.length()).equals("Chv")) {
                sbSQL.append(strNomeAtributo).append((", "));
            }
        }
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 2, sbSQL.length());
        
        sbSQL.append(") VALUES (");
        
        //Lista as entradas (Parâmetros)
        for (Iterator it = lhmAtributosClasse.keySet().iterator(); it.hasNext(); ) {
            strNomeAtributo = it.next().toString();
            
            if (!strNomeAtributo.equals("NomeTabela") && !strNomeAtributo.substring(strNomeAtributo.length()-3, strNomeAtributo.length()).equals("Chv")) {
                sbSQL.append("?, ");
            }
        }
        
        //Retira o excesso
        sbSQL.delete(sbSQL.length() - 2, sbSQL.length());
        
        sbSQL.append(")");
        
        return sbSQL.toString();
    }
    
    protected static LinkedHashMap getAtributosClasse(final Object Tabela) {
        LinkedHashMap lhmAtributosClasse = new LinkedHashMap();
        
        //Métodos (Valores dos atributos)
        Method methods[] = Tabela.getClass().getDeclaredMethods();
        for (int intValores = 0; intValores < methods.length; intValores++) {
            if(!methods[intValores].getReturnType().equals(Void.class) && methods[intValores].getParameterTypes().length <= 0) {
                try {
                    //if (lhmAtributosClasse.containsKey(methods[intValores].getName().substring(3, methods[intValores].getName().length()))) {
                    System.out.println("Valor do Método = " + methods[intValores].getName() + " - " + methods[intValores].invoke(Tabela, new Object[0]));
                    if (methods[intValores].invoke(Tabela, new Object[0]) != null) {
                        lhmAtributosClasse.put(methods[intValores].getName().substring(3, methods[intValores].getName().length()), methods[intValores].invoke(Tabela, new Object[0]));
                    }
                    //}
                } catch (IllegalArgumentException ex) {
                    ex.printStackTrace();
                } catch (InvocationTargetException ex) {
                    ex.printStackTrace();
                } catch (IllegalAccessException ex) {
                    ex.printStackTrace();
                }
            }
        }
        
        return lhmAtributosClasse;
    }
    
    protected static PreparedStatement TrataParametro(final PreparedStatement pstmt, final int i, final Object Objeto) throws SQLException {
        PreparedStatement pstmt2 = pstmt;
        
        //Trata o parâmetro
        if(Objeto instanceof GregorianCalendar) {
            pstmt2.setDate(i, new java.sql.Date(((GregorianCalendar) Objeto).getTime().getTime()));
        } else if (Objeto instanceof String) {
            pstmt2.setString(i, (String) Objeto);
        } else if (Objeto instanceof Integer) {
            pstmt2.setInt(i, (Integer) Objeto);
        } else {
            pstmt2.setString(i, "Null");
        }
        
        return pstmt2;
    }
    
}

Você não pode utilizar uma referência ‘this’ dentro de um contexto static.

kkkkkkkkkkkkkk

Putz!, sério!?

Valeu!

Muito obrigado mesmo.

Mas pq.!?

<teoria da conspiração>
O Governo Americano, o FBI, a CIA, a NSA e a Sun sempre esconderam este fato de você.
Prepare-se para ter a seguinte revelação:
Métodos de instância (ou seja, aqueles que não são “static”) recebem um parâmetro escondido “this” (escondido porque você não deve explicitá-lo).
Por exemplo, quando você escreve o seguinte:

class Cliente {
    private String nome;
    public String getNome() { return this.nome; }
}

o código é equivalente ao seguinte código (embora o código abaixo não compile, mas isto é só para você entender):

class Cliente {
    public static String getNome(Cliente this) { return this.nome; }
}

Se você olhar o código gerado em bytecodes, vai ver que é exatamente isso mesmo*

Se você declara um método especificamente como “static”, esse parâmetro escondido não é passado, e você por conseguinte não pode usar “this”. OK?

</teoria da conspiração>


  • É óbvio que não é exatamente equivalente em bytecodes, porque no caso real é usado o bytecode invokevirtual e no caso simulado, que usei para explicar, seria usado o bytecode invokestatic. Se houvesse herança, o código com “static getNome” não funcionaria adequadamente. Mas é sempre útil explicar as coisas de maneira simplificada, para poder entender corretamente o que ocorre.

Porque ‘static’ é uma referência que se relaciona com a classe, e this é uma referência para a instância do objeto.
Logo, dentro de um contexto static, pode não existir uma instância do objeto em memória para você fazer a chamada ‘this’.

Caraca !

Muito obrigado mesmo pela explicação.

Agora ficou claro.