Duvida no objeto de classe

Galera, quando eu faço por exemplo:

Class rep = Repetition.class;

rep recebe um objeto do tipo Class, ou seja um objeto da minha classe Repetition, eu tenho um método static dentro dessa classe, porque quando eu faço

rep.meuMetodoStatic()

meu objeto do tipo Class, não encherga esse metodo statico? Sendo que staticos pertencem a classe.

Objetos são criados com a palavra new. Dessa forma, você só está pegando a definição da classe (o tipo dela).
Para acessar o método estático use Repetition.meuMetodoStatic();

Posso estar falando uma bobagem mas neste caso você tem uma referência a classe de forma que mesmo os métodos estáticos somente por reflection, você poderia fazer isso.
Agora lhe pergunto, porque raios quer fazer isto? :slight_smile:

Abraços.

[quote=luiz.portnoy]Objetos são criados com a palavra new. Dessa forma, você só está pegando a definição da classe (o tipo dela).
Para acessar o método estático use Repetition.meuMetodoStatic();[/quote]

Sim eu entendo que pra acessar métodos staticos pode ser dessa forma Repetition.static();

Não entendi o que vc quer dizer com “definiçao da classe (o tipo dela)”.

[quote=nel]Posso estar falando uma bobagem mas neste caso você tem uma referência a classe de forma que mesmo os métodos estáticos somente por reflection, você poderia fazer isso.
Agora lhe pergunto, porque raios quer fazer isto? :slight_smile:

Abraços.[/quote]

So pra entender direito o getClass() ou AlgumaClasse.class.

Eu sei que ao syncronizar com “.class” eu consigo bloquear meus métodos staticos para acesso simultaneos de threads.

[quote=Dota][quote=luiz.portnoy]Objetos são criados com a palavra new. Dessa forma, você só está pegando a definição da classe (o tipo dela).
Para acessar o método estático use Repetition.meuMetodoStatic();[/quote]

Sim eu entendo que pra acessar métodos staticos pode ser dessa forma Repetition.static();

Não entendi o que vc quer dizer com “definiçao da classe (o tipo dela)”.[/quote]

Por exemplo:

String teste = new String();

A definição da classe é String. O nome da váriavel de referência é teste.

Se você tivesse algum método genérico, que precisasse saber qual é o tipo da classe correto para fazer alguma operação, aí você usaria o .class

Simplesmente “viajei” agora. Como se bloquea um método para acessos simultaneos? Por default, um método já é disponível para n threads, para que ele seja acessível por uma única thread, ai precisamos utilizar o “syncronized”, mas nunca ouvi falar em “bloquear para várias threads simultaneamente”.

E outro detalhe, se é possível bloquer de alguma forma um método para uma única thread, por exemplo, em tempo de compilação, ou seja, sem utilizar o “syncronized” no método, gostaria que demonstrasse como, pois desejo adicionar ao meu “Livro Java”.

Abraços.

[quote=luiz.portnoy][quote=Dota][quote=luiz.portnoy]Objetos são criados com a palavra new. Dessa forma, você só está pegando a definição da classe (o tipo dela).
Para acessar o método estático use Repetition.meuMetodoStatic();[/quote]

Sim eu entendo que pra acessar métodos staticos pode ser dessa forma Repetition.static();

Não entendi o que vc quer dizer com “definiçao da classe (o tipo dela)”.[/quote]

Por exemplo:

String teste = new String();

A definição da classe é String. O nome da váriavel de referência é teste.

Se você tivesse algum método genérico, que precisasse saber qual é o tipo da classe correto para fazer alguma operação, aí você usaria o .class

[/quote]

Ah ta, mas estranho que ao usar .class no bloco sincronizado eu consiga bloquear meus métodos statics.

Simplesmente “viajei” agora. Como se bloquea um método para acessos simultaneos? Por default, um método já é disponível para n threads, para que ele seja acessível por uma única thread, ai precisamos utilizar o “syncronized”, mas nunca ouvi falar em “bloquear para várias threads simultaneamente”.

E outro detalhe, se é possível bloquer de alguma forma um método para uma única thread, por exemplo, em tempo de compilação, ou seja, sem utilizar o “syncronized” no método, gostaria que demonstrasse como, pois desejo adicionar ao meu “Livro Java”.

Abraços.[/quote]

Eu disse que ao sincronizar dessa forma por exemplo:

[code]public static void teste(){

synchronized(MinhaClasse.class){}

}[/code]

Estou bloqueando para que varios threads não acessam esse método simultaneamente, e outros métodos que forem sincronizados e staticos.

Eu li e interpretei errado, pois imaginava que você havia dito que ele bloqueava para que o método somente fosse acessível por n threads.
Então, ok. A sua dúvida, é porque utilizando-se do .class não consegue acesso ao seu respectivo método estático perfeito?

Esta resposta você já teve, como foi dito acima, certo? :slight_smile:
Abraços.

[quote=nel]Eu li e interpretei errado, pois imaginava que você havia dito que ele bloqueava para que o método somente fosse acessível por n threads.
Então, ok. A sua dúvida, é porque utilizando-se do .class não consegue acesso ao seu respectivo método estático perfeito?

Esta resposta você já teve, como foi dito acima, certo? :slight_smile:
Abraços.[/quote]

À duvida é, se eu consigo bloquear acesso á metodos staticos com o .class, pq com um objeto da classe nao consigo acessar metodos staticos, logo que os mesmos sao da classe e nao da instancia.

Dota, faz um teste assim:

Repetition.class.getMethods[];

Isso vai retornar uma array do tipo Method. Itere sobre ele e talvez você ache o método estático nessa iteração. Eu não tenho como testar aqui… :frowning:

Nesse caso voce tem uma referencia ao Class dele, o Class guarda a estrutura da classe.
Voce pode acessar via Reflection seus métodos, atributos e construtores.

Mas ele não é um objeto da sua classe, então voce nunca vai conseguir invocar um método pelo nome.

O GUJ mesmo disponibiliza um artigo muito interessante e prático sobre Reflection.
Efetuei um teste aqui e meu método estatico é invocado normalmente, entretanto, não verifiquei a questão de bloquear este método via reflection, se isto é possível é claro.
E se for, eu teria que pesquisar pois nunca precisei e/ou fiz algo assim :slight_smile:

Abraços.

P.s: invoquei métodos de Objeto e da Classe, ou seja, método não-estático e estático.

[quote=nel]O GUJ mesmo disponibiliza um artigo muito interessante e prático sobre Reflection.
Efetuei um teste aqui e meu método estatico é invocado normalmente, entretanto, não verifiquei a questão de bloquear este método via reflection, se isto é possível é claro.
E se for, eu teria que pesquisar pois nunca precisei e/ou fiz algo assim :slight_smile:

Abraços.

P.s: invoquei métodos de Objeto e da Classe, ou seja, método não-estático e estático.[/quote]

Muito legal essa questao do Reflection nao sabia.

Mas o que acontece realmente entao, nas questoes de thread quando sincronizamos com o “.class”, pois se o método for statico automaticamente pega o bloqueio da classe. Agora quando tentamos usar um objeto do tipo Class nao consiguimos vê-los.

[quote=Dota][quote=nel]O GUJ mesmo disponibiliza um artigo muito interessante e prático sobre Reflection.
Efetuei um teste aqui e meu método estatico é invocado normalmente, entretanto, não verifiquei a questão de bloquear este método via reflection, se isto é possível é claro.
E se for, eu teria que pesquisar pois nunca precisei e/ou fiz algo assim :slight_smile:

Abraços.

P.s: invoquei métodos de Objeto e da Classe, ou seja, método não-estático e estático.[/quote]

Muito legal essa questao do Reflection nao sabia.

Mas o que acontece realmente entao, nas questoes de thread quando sincronizamos com o “.class”, pois se o método for statico automaticamente pega o bloqueio da classe. Agora quando tentamos usar um objeto do tipo Class nao consiguimos vê-los. [/quote]

Você quer dizer assim, .class.MetodoEstatico certo? Como já foi explicado, quando você tem o .class você tem a referência a classe e não a classe em si, como se você fizesse, SuaClasse.métodoEstatico. É a partir desta referência que é possível utilizar Reflection para invocar métodos e etc, inclusive, é possível chamar um método do tipo private.

Não sou especialista, estou bem longe disso, em Reflection, mas entenda que .class é uma referência a classe.
Abraços.