Considere el ejemplo más simple posible. Tenemos
public class Foo {}
Por lo tanto podemos decir
Foo.class // ==> class Foo
Por lo tanto, es lógico que Foo
debe ser una java.lang.Class
, ya que tenemos claramente el acceso a la misma y podemos manipularlo en el contexto actual. Todavía
Foo instanceof java.lang.Class
plantea el error
cannot find symbol
symbol: variable Foo
Foo instanceof java.lang.Class
^-^
Esto no es nada que ver con instanceof en sí, sin embargo; sólo
Foo
solo en el shell OpenJDK produce el mismo error.
¿Cómo podemos acceder a las propiedades en Foo
caso de Foo
no existir en el contexto actual?
A nombre de la clase se puede utilizar en el código fuente como parte de muchas expresiones diferentes. Esto no quiere decir que el nombre de la clase en sí es un objeto; sólo significa que el nombre en sí mismo puede ser utilizado como parte de una expresión más grande. Estos no son "propiedades" o atributos; que son otras construcciones sintácticas utilizadas para formar expresiones con muchas partes diferentes.
Los JLS define cómo un "TypeName", por ejemplo, Foo
se puede utilizar para expresiones forma en el capítulo 15. Específicamente:
Sección 15.8.2, Clase literales .
TypeName {[]}.
class
Sección 15.8.4, calificó este , para acceder a la clase léxica que encierra.
TypeName .
this
Sección 15.11, el acceso de campo expresiones , para acceder a la clase léxica que encierra como una superclase.
TypeName .
super
. identificadorSección 15.12, las expresiones de invocación de método , para llamar a un método estático.
TypeName . [ TypeArguments ] Identificador ([ ArgumentList ])
TypeName .
super
. [ TypeArguments ] Identificador ([ ArgumentList ])Sección 15.13, Método Expresiones de referencia , para referirse a los métodos de una clase que encierra que puede ser invocada más tarde.
Escribe un nombre .
super
:: [TypeArguments] Identifier
También puede ser un derecho "tipo de referencia" para otras expresiones, tales como:
Sección 15.16, expresiones de conversión , para crear expresiones de conversión.
( ReferenceType { AdditionalBound }) UnaryExpressionNotPlusMinus
Sección 15.20.2, Tipo de Operador de comparación
instanceof
, utilizandoinstanceof
.RelationalExpression
instanceof
ReferenceType
Hay usos específicos de un ejemplo nombre del tipo Foo
que se ha descrito anteriormente. Esto no implica que el nombre del tipo se puede utilizar en general como su propio objeto. Los nombres de tipo sólo se permiten como parte de las expresiones más grandes que pueden ser de otro modo no relacionado.