Ref.: Non-static variable this cannot

Bom dia a todos.

Estou tentando aprender JAVA na marra a uns dois anos.

Não tenho muito tempo livre para isso, mas podem acreditar que todo o possíverl estou tentando desenvolver classes para agilizar meus desenvolvimentos, já que tenho que desenvolver o que me pedem.

Nesse momento estou tentando criar uma classe que persista …

Preciso criar esta classe (Abaixo), porém não desejo que a mesma seje instânciada. (Não sei bem se estou certo!). E esta dando o erro que disse no título desde tópico.

Se purem me ajudar, desde já agradeço.

Passo como parâmetro um objeto Tabela.

[code]/*

  • 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 {
    private Object tbTabela;
    private Class clsTabela;
    private String strNomeTabela;
    private LinkedHashMap lhmAtributosClasse;
    private Connection Conexao;

    private ManutencaoTabela() {
    //
    }

    public static void IncluiRegistro(final Object Tabela, final Connection Conexao) {
    this.ExecutaTransacao(this.PreparaInclusaoRegistro(Tabela));
    }

    public static void AtualizaRegistro(final Object Tabela, final Connection Conexao) {
    this.ExecutaTransacao(this.PreparaAlteracaoRegistro(Tabela));
    }

    public static void ExcluiRegistro(final Object Tabela, final Connection Conexao) {
    this.ExecutaTransacao(this.PreparaExclusaoRegistro(Tabela));
    }

    public static void RecuperaRegistro(final Object Tabela, final Connection Conexao) {
    this.ExecutaTransacao(this.PreparaRecuperacaoRegistro(Tabela));
    }

    protected static void ExecutaTransacao(final String strSQL) {
    String strNomeAtributo = new String();

     try {
         //Prepara transação
         PreparedStatement pstmt = this.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&#40;strSQL&#41;;
        
        //Executa  procedimento
        pstmt.executeUpdate&#40;&#41;;
        
        //Fecha procedimento
        pstmt.close&#40;&#41;;

// //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&#40;final Object Tabela&#41; &#123;
    LinkedHashMap lhmAtributosClasse = new LinkedHashMap&#40;&#41;;
    StringBuffer sbSQL = new StringBuffer&#40;&#41;;
    String strNomeAtributo = new String&#40;&#41;;
    
    //
    lhmAtributosClasse = this.getAtributosClasse&#40;Tabela&#41;;
    
    //Inclui Registro
    sbSQL.append&#40;&quot;INSERT INTO &quot;&#41;.append&#40;lhmAtributosClasse.get&#40;&quot;NomeTabela&quot;&#41; + &quot; &quot;&#41;;
    sbSQL.append&#40;&quot;&#40;&quot;&#41;;
    
    //Lista as entradas &#40;Campos da Tabela&#41;
    for &#40;Iterator it = lhmAtributosClasse.keySet&#40;&#41;.iterator&#40;&#41;; it.hasNext&#40;&#41;; &#41; &#123;
        strNomeAtributo = it.next&#40;&#41;.toString&#40;&#41;;
        
        if &#40;!strNomeAtributo.equals&#40;&quot;NomeTabela&quot;&#41; &amp;&amp; !strNomeAtributo.substring&#40;strNomeAtributo.length&#40;&#41;-3, strNomeAtributo.length&#40;&#41;&#41;.equals&#40;&quot;Chv&quot;&#41;&#41; &#123;
            sbSQL.append&#40;strNomeAtributo&#41;.append&#40;&#40;&quot;, &quot;&#41;&#41;;
        &#125;
    &#125;
    
    //Retira o excesso
    sbSQL.delete&#40;sbSQL.length&#40;&#41; - 2, sbSQL.length&#40;&#41;&#41;;
    
    sbSQL.append&#40;&quot;&#41; VALUES &#40;&quot;&#41;;
    
    //Lista as entradas &#40;Parâmetros&#41;
    for &#40;Iterator it = lhmAtributosClasse.keySet&#40;&#41;.iterator&#40;&#41;; it.hasNext&#40;&#41;; &#41; &#123;
        strNomeAtributo = it.next&#40;&#41;.toString&#40;&#41;;
        
        if &#40;!strNomeAtributo.equals&#40;&quot;NomeTabela&quot;&#41; &amp;&amp; !strNomeAtributo.substring&#40;strNomeAtributo.length&#40;&#41;-3, strNomeAtributo.length&#40;&#41;&#41;.equals&#40;&quot;Chv&quot;&#41;&#41; &#123;
            sbSQL.append&#40;&quot;?, &quot;&#41;;
        &#125;
    &#125;
    
    //Retira o excesso
    sbSQL.delete&#40;sbSQL.length&#40;&#41; - 2, sbSQL.length&#40;&#41;&#41;;
    
    sbSQL.append&#40;&quot;&#41;&quot;&#41;;
    
    return sbSQL.toString&#40;&#41;;
&#125;

protected String PreparaAlteracaoRegistro&#40;final Object Tabela&#41; &#123;

// if (lhmAtributosClasse.containsKey("MatriculaChv"))
// throw new IllegalArgumentException("O mapa deve conter o ItemEspecial!");

    LinkedHashMap lhmAtributosClasse = new LinkedHashMap&#40;&#41;;
    StringBuffer sbSQL = new StringBuffer&#40;&#41;;
    String strNomeAtributo = new String&#40;&#41;;
    
    //
    lhmAtributosClasse = this.getAtributosClasse&#40;Tabela&#41;;
    
    //Alterar Registro
    sbSQL.append&#40;&quot;UPDATE &quot;&#41;.append&#40;lhmAtributosClasse.get&#40;&quot;NomeTabela&quot;&#41; + &quot; SET &quot;&#41;;
    
    //Lista as entradas &#40;Campos da Tabela/Parâmetros&#41;
    for &#40;Iterator it = lhmAtributosClasse.keySet&#40;&#41;.iterator&#40;&#41;; it.hasNext&#40;&#41;; &#41; &#123;
        strNomeAtributo = it.next&#40;&#41;.toString&#40;&#41;;
        
        if &#40;!strNomeAtributo.equals&#40;&quot;NomeTabela&quot;&#41; &amp;&amp;
            !strNomeAtributo.substring&#40;strNomeAtributo.length&#40;&#41;-3, strNomeAtributo.length&#40;&#41;&#41;.equals&#40;&quot;Chv&quot;&#41;&#41; &#123;
            sbSQL.append&#40;strNomeAtributo&#41;.append&#40;&quot; = &quot;&#41;.append&#40;&quot;?, &quot;&#41;;
        &#125;
    &#125;
    
    //Retira o excesso
    sbSQL.delete&#40;sbSQL.length&#40;&#41; - 2, sbSQL.length&#40;&#41;&#41;.append&#40;&quot; &quot;&#41;;
    
    sbSQL.append&#40;&quot;WHERE &quot;&#41;;
    
    //Lista as entradas &#40;Campos Chave&#41;
    for &#40;Iterator it = lhmAtributosClasse.keySet&#40;&#41;.iterator&#40;&#41;; it.hasNext&#40;&#41;; &#41; &#123;
        strNomeAtributo = it.next&#40;&#41;.toString&#40;&#41;;
        
        if &#40;strNomeAtributo.substring&#40;strNomeAtributo.length&#40;&#41;-3, strNomeAtributo.length&#40;&#41;&#41;.equals&#40;&quot;Chv&quot;&#41;&#41; &#123;
            sbSQL.append&#40;strNomeAtributo&#41;.append&#40;&quot; = &quot;&#41;.append&#40;&quot;?, &quot;&#41;;
        &#125;
    &#125;
    
    //Retira o excesso
    sbSQL.delete&#40;sbSQL.length&#40;&#41; - 2, sbSQL.length&#40;&#41;&#41;;
    
    return sbSQL.toString&#40;&#41;;
&#125;

protected String PreparaExclusaoRegistro&#40;final Object Tabela&#41; &#123;
    LinkedHashMap lhmAtributosClasse = new LinkedHashMap&#40;&#41;;
    StringBuffer sbSQL = new StringBuffer&#40;&#41;;
    String strNomeAtributo = new String&#40;&#41;;
    
    //
    lhmAtributosClasse = this.getAtributosClasse&#40;Tabela&#41;;
    
    //Exclui Registro
    sbSQL.append&#40;&quot;DELETE FROM &quot;&#41;.append&#40;lhmAtributosClasse.get&#40;&quot;NomeTabela&quot;&#41; + &quot; &quot;&#41;;
    
    sbSQL.append&#40;&quot;WHERE &quot;&#41;;
    
    //Lista as entradas &#40;Campos Chave&#41;
    for &#40;Iterator it = lhmAtributosClasse.keySet&#40;&#41;.iterator&#40;&#41;; it.hasNext&#40;&#41;; &#41; &#123;
        strNomeAtributo = it.next&#40;&#41;.toString&#40;&#41;;
        
        if &#40;strNomeAtributo.substring&#40;strNomeAtributo.length&#40;&#41;-3, strNomeAtributo.length&#40;&#41;&#41;.equals&#40;&quot;Chv&quot;&#41;&#41; &#123;
            sbSQL.append&#40;strNomeAtributo&#41;.append&#40;&quot; = &quot;&#41;.append&#40;&quot;?, &quot;&#41;;
        &#125;
    &#125;
    
    //Retira o excesso
    sbSQL.delete&#40;sbSQL.length&#40;&#41; - 2, sbSQL.length&#40;&#41;&#41;.append&#40;&quot; &quot;&#41;;
    
    return sbSQL.toString&#40;&#41;;
&#125;

protected String PreparaRecuperacaoRegistro&#40;final Object Tabela&#41; &#123;
    LinkedHashMap lhmAtributosClasse = new LinkedHashMap&#40;&#41;;
    StringBuffer sbSQL = new StringBuffer&#40;&#41;;
    String strNomeAtributo = new String&#40;&#41;;
    
    //
    lhmAtributosClasse = this.getAtributosClasse&#40;Tabela&#41;;
    
    //Exclui Registro
    sbSQL.append&#40;&quot;SELECT FROM * &quot;&#41;.append&#40;lhmAtributosClasse.get&#40;&quot;NomeTabela&quot;&#41; + &quot; &quot;&#41;;
    
    sbSQL.append&#40;&quot;WHERE &quot;&#41;;
    
    //Lista as entradas &#40;Campos Chave&#41;
    for &#40;Iterator it = lhmAtributosClasse.keySet&#40;&#41;.iterator&#40;&#41;; it.hasNext&#40;&#41;; &#41; &#123;
        strNomeAtributo = it.next&#40;&#41;.toString&#40;&#41;;
        
        if &#40;strNomeAtributo.substring&#40;strNomeAtributo.length&#40;&#41;-3, strNomeAtributo.length&#40;&#41;&#41;.equals&#40;&quot;Chv&quot;&#41;&#41; &#123;
            sbSQL.append&#40;strNomeAtributo&#41;.append&#40;&quot; = &quot;&#41;.append&#40;&quot;?, &quot;&#41;;
        &#125;
    &#125;
    
    //Retira o excesso
    sbSQL.delete&#40;sbSQL.length&#40;&#41; - 2, sbSQL.length&#40;&#41;&#41;.append&#40;&quot; &quot;&#41;;
    
    return sbSQL.toString&#40;&#41;;
&#125;

protected LinkedHashMap getAtributosClasse&#40;final Object Tabela&#41; &#123;
    LinkedHashMap lhmAtributosClasse = new LinkedHashMap&#40;&#41;;

// //Campos (Nomes dos atributos)
// Field fields[] = clsTabela.getDeclaredFields();
// for (int intCampos = 0; intCampos < fields.length; intCampos++) {
// lhmAtributosClasse.put(fields[intCampos].getName(), null);
// }

    //Métodos &#40;Valores dos atributos&#41;
    Method methods&#91;&#93; = clsTabela.getDeclaredMethods&#40;&#41;;
    for &#40;int intValores = 0; intValores &lt; methods.length; intValores++&#41; &#123;
        if&#40;!methods&#91;intValores&#93;.getReturnType&#40;&#41;.equals&#40;Void.class&#41; &amp;&amp; methods&#91;intValores&#93;.getParameterTypes&#40;&#41;.length &lt;= 0&#41; &#123;
            try &#123;
                //if &#40;lhmAtributosClasse.containsKey&#40;methods&#91;intValores&#93;.getName&#40;&#41;.substring&#40;3, methods&#91;intValores&#93;.getName&#40;&#41;.length&#40;&#41;&#41;&#41;&#41; &#123;
                System.out.println&#40;&quot;Valor do Método = &quot; + methods&#91;intValores&#93;.getName&#40;&#41; + &quot; - &quot; + methods&#91;intValores&#93;.invoke&#40;tbTabela, new Object&#91;0&#93;&#41;&#41;;
                if &#40;methods&#91;intValores&#93;.invoke&#40;tbTabela, new Object&#91;0&#93;&#41; != null&#41; &#123;
                    lhmAtributosClasse.put&#40;methods&#91;intValores&#93;.getName&#40;&#41;.substring&#40;3, methods&#91;intValores&#93;.getName&#40;&#41;.length&#40;&#41;&#41;, methods&#91;intValores&#93;.invoke&#40;tbTabela, new Object&#91;0&#93;&#41;&#41;;
                &#125;
                //&#125;
            &#125; catch &#40;IllegalArgumentException ex&#41; &#123;
                ex.printStackTrace&#40;&#41;;
            &#125; catch &#40;InvocationTargetException ex&#41; &#123;
                ex.printStackTrace&#40;&#41;;
            &#125; catch &#40;IllegalAccessException ex&#41; &#123;
                ex.printStackTrace&#40;&#41;;
            &#125;
        &#125;
    &#125;
    
    return lhmAtributosClasse;
&#125;

protected PreparedStatement TrataParametro&#40;final PreparedStatement pstmt, final int i, final Object Objeto&#41; throws SQLException &#123;
    PreparedStatement pstmt2 = pstmt;
    
    //Trata o parâmetro
    if&#40;Objeto instanceof GregorianCalendar&#41; &#123;
        pstmt2.setDate&#40;i, new java.sql.Date&#40;&#40;&#40;GregorianCalendar&#41; Objeto&#41;.getTime&#40;&#41;.getTime&#40;&#41;&#41;&#41;;
    &#125; else if &#40;Objeto instanceof String&#41; &#123;
        pstmt2.setString&#40;i, &#40;String&#41; Objeto&#41;;
    &#125; else if &#40;Objeto instanceof Integer&#41; &#123;
        pstmt2.setInt&#40;i, &#40;Integer&#41; Objeto&#41;;
    &#125; else &#123;
        pstmt2.setString&#40;i, &quot;Null&quot;&#41;;
    &#125;
    
    return pstmt2;
&#125;

}
[/code]

Para pensar: se você não quer criar instância, por que sua classe esta cheia de atributos de instância, eles não vão servir para nada então?! por que você tem um monte de métodos de instância (PreparaRecuperacaoRegistro, TrataParametro, getAtributosClasse, etc)?! você tem um monte de método estático que acessa a referencia this, que nada mais é que uma referencia do objeto para a si mesmo, se num bloco estático vc não tem instância, como pode existir um this?!

Paulo Roberto,

Vc quer poder chamar esses métodos da classe IncluiRegistro, AtualizaRegistro, etc, da classe ManutencaoTabela sem a necessidade de instanciar, é isso?

Bom se for isso é o seguinte…

Note bem que vc definiu esses métodos como sendo estáticos, ou seja, usou o modificador static em suas assinaturas e dentro destes métodos vc está chamando o método ExecutaTransacao() que também é estático.

se vc define um método como sendo estático vc não pode usar o operador this para chamá-lo. Neste caso, vc deve especificar assim:

    public static void IncluiRegistro&#40;final Object Tabela, final Connection Conexao&#41; &#123; 
        ExecutaTransacao&#40;PreparaInclusaoRegistro&#40;Tabela&#41;&#41;; 
    &#125; 

Outra coisa é que dentro de um contexto estático vc não pode usar o operador this para referenciar metodos ou atributos da classe.

    protected static void ExecutaTransacao&#40;final String strSQL&#41; &#123; 
        String strNomeAtributo = new String&#40;&#41;; 
        
        try &#123; 
            //Prepara transação 
            PreparedStatement pstmt = this.Conexao.prepareStatement&#40;strSQL&#41;;
        ....
        ....
        ....

Deste modo vc não pode usar:

PreparedStatement pstmt = this.Conexao.prepareStatement&#40;strSQL&#41;;

Mas sim,

PreparedStatement pstmt = Conexao.prepareStatement&#40;strSQL&#41;;

Obviamente vc precisa especificar o atributo como sendo estático também para poder usá-lo dentro deste contexto.

public class ManutencaoTabela &#123; 
    ....
    ....
    ....
    private static Connection Conexao;
    ....
    ....
    ....
&#125;

Bom… E assim sucessivamente. Espero que te ajude.

@braços,
Cleiton

Pegadinha de certificação. xD