Ответ 1
Class<String> c = String.class;
Просмотрите Javadoc для java.lang.Class
, чтобы узнать, что вы можете сделать с одним из этих маленьких ребят - в основном, связанных с отражением
Из учебника по Java:
Наконец, также есть специальный тип литерала, называемый литералом класса, образованный путем ввода имени типа и добавления "
.class
"; например,String.class
. Это относится к объекту (типаClass
), который представляет сам тип.
К какому типу переменной может быть назначен этот литерал?
Пожалуйста, приведите небольшой пример, если это возможно.
Class<String> c = String.class;
Просмотрите Javadoc для java.lang.Class
, чтобы узнать, что вы можете сделать с одним из этих маленьких ребят - в основном, связанных с отражением
Чтобы понять это, вы должны понимать, что Строка - это экземпляр (объект) класса Класс. Строковый литерал (например, "Я - строка" ) - это обозначение, которое представляет экземпляр (объект) класса String, тогда как литерал класса (например, Hashtable.class) является обозначением, которое представляет экземпляр класса Класс.
Благодаря другим хорошим ответам здесь вы знаете, что это такое, но здесь типичный пример использования, который также может уточнить:
private static Logger log = Logger.getLogger(YourClassHere.class);
Как показывает код, это строка, в которой мы инициализируем структуру ведения журнала (в этом примере я использую пакет org.apache.log4j
, но этот принцип распространяется на другие структуры). Для метода getLogger()
требуется литерал класса, чтобы он знал, что он регистрирует (т.е. Текущий класс объекта).
Согласно JLS
15.8.2 Литералы классов
Литерал класса - это выражение, состоящее из имени класса, интерфейса, массива или примитивного типа, за которым следует
.
и токенclass
. Тип литерала классаclass
. Он оценивает объект Class для именованного типа (или дляvoid
), как определено определяющим загрузчиком класса для класса текущего экземпляра.
Некоторые общие применения могут быть найдены в литералах класса как токены типа времени выполнения.
Сам литерал MyClass
. Если вы пишете MyClass.class
, вы получаете ссылку на объект класса. Если вы пишете new MyClass()
, он использует литерал, чтобы получить экземпляр объекта класса, который вы получаете с помощью MyClass.class
. Из экземпляра вы получаете один и тот же объект класса, вызывая myClassInstance.getClass()
.
Я не уверен на 100%, но сам литерал не может быть привязан к какой-либо переменной. Что вы можете сделать, так это получить имя класса как строку и использовать фреймворк reflection для создания экземпляра.
В примерах это примерно так:
Class myClass = MyClass.class
или
MyClass.class.getResourceAsStream("config.properties");
Чтобы понять это, вы должны понимать, что String
является instance (object)
его superclass (parent class)
Object
.
class String
instance (object)
равно String literal
(например, "I am a string."
):
class | instance (object) | literal
------------------------------------------------
String | instance_name = | "I am a string."
тогда как значение class Object
instance (object)
равно Class literal
- (например, Hashtable.class
), которое относится к class Hashtable
instance (object)
class | instance (object) | literal
------------------------------------------------
Hashtable | instance_name | Hashtable.
Когда JVM загружает ваши классы приложений, она сохраняет их как объекты java.class.Class
.
Итак, обычно в памяти есть несколько экземпляров типа Class
которые представляют ваши классы. Так что вы можете сделать что-то вроде этого:
Class<Bicycle> bicycleClass = Bicycle.class; // returns the object storing your Bicycle class
bicycleClass.getName(); // returns your class name
bicycleClass.getDeclaredMethods(); // returns your (declared) class methods
package training;
import java.lang.reflect.Method;
public class Training {
public static void main(String[] args) {
// TODO Auto-generated method stub
Class<Training> myclass = Training.class;
Method[] myclassarr = myclass.getDeclaredMethods();
System.out.println(myclass);
System.out.println(myclass.getName());
for (int i = 0; i < myclassarr.length; i++) {
System.out.println(myclassarr[i]);
}
System.out.println();
Class<String> strobj = String.class;
System.out.println(strobj);
System.out.println(strobj.getName());
Method[] strobjarr = strobj.getDeclaredMethods();
for (int j = 0; j < strobjarr.length; j++) {
System.out.println(strobjarr[j]);
}
}
public void MethodA() {
}
public static void MethodB() {
}
}
Выход:
class training.Training
training.Training
public static void training.Training.main(java.lang.String[])
public void training.Training.MethodA()
public static void training.Training.MethodB()
class java.lang.String
java.lang.String
public boolean java.lang.String.equals(java.lang.Object)
public java.lang.String java.lang.String.toString()
public int java.lang.String.hashCode()
public int java.lang.String.compareTo(java.lang.String)
public int java.lang.String.compareTo(java.lang.Object)
public int java.lang.String.indexOf(java.lang.String,int)
public int java.lang.String.indexOf(java.lang.String)
public int java.lang.String.indexOf(int,int)
public int java.lang.String.indexOf(int)
static int java.lang.String.indexOf(char[],int,int,char[],int,int,int)
static int java.lang.String.indexOf(char[],int,int,java.lang.String,int)
public static java.lang.String java.lang.String.valueOf(int)
public static java.lang.String java.lang.String.valueOf(long)
public static java.lang.String java.lang.String.valueOf(float)
public static java.lang.String java.lang.String.valueOf(boolean)
public static java.lang.String java.lang.String.valueOf(char[])
public static java.lang.String java.lang.String.valueOf(char[],int,int)
public static java.lang.String java.lang.String.valueOf(java.lang.Object)
public static java.lang.String java.lang.String.valueOf(char)
public static java.lang.String java.lang.String.valueOf(double)
public char java.lang.String.charAt(int)
private static void java.lang.String.checkBounds(byte[],int,int)
public int java.lang.String.codePointAt(int)
public int java.lang.String.codePointBefore(int)
public int java.lang.String.codePointCount(int,int)
public int java.lang.String.compareToIgnoreCase(java.lang.String)
public java.lang.String java.lang.String.concat(java.lang.String)
public boolean java.lang.String.contains(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.CharSequence)
public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
public static java.lang.String java.lang.String.copyValueOf(char[])
public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
public boolean java.lang.String.endsWith(java.lang.String)
public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])
public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])
public void java.lang.String.getBytes(int,int,byte[],int)
public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
public byte[] java.lang.String.getBytes()
public void java.lang.String.getChars(int,int,char[],int)
void java.lang.String.getChars(char[],int)
private int java.lang.String.indexOfSupplementary(int,int)
public native java.lang.String java.lang.String.intern()
public boolean java.lang.String.isEmpty()
public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.CharSequence[])
public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.Iterable)
public int java.lang.String.lastIndexOf(int)
public int java.lang.String.lastIndexOf(java.lang.String)
static int java.lang.String.lastIndexOf(char[],int,int,java.lang.String,int)
public int java.lang.String.lastIndexOf(java.lang.String,int)
public int java.lang.String.lastIndexOf(int,int)
static int java.lang.String.lastIndexOf(char[],int,int,char[],int,int,int)
private int java.lang.String.lastIndexOfSupplementary(int,int)
public int java.lang.String.length()
public boolean java.lang.String.matches(java.lang.String)
private boolean java.lang.String.nonSyncContentEquals(java.lang.AbstractStringBuilder)
public int java.lang.String.offsetByCodePoints(int,int)
public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
public java.lang.String java.lang.String.replace(char,char)
public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)
public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String)
public java.lang.String[] java.lang.String.split(java.lang.String,int)
public boolean java.lang.String.startsWith(java.lang.String,int)
public boolean java.lang.String.startsWith(java.lang.String)
public java.lang.CharSequence java.lang.String.subSequence(int,int)
public java.lang.String java.lang.String.substring(int)
public java.lang.String java.lang.String.substring(int,int)
public char[] java.lang.String.toCharArray()
public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
public java.lang.String java.lang.String.toLowerCase()
public java.lang.String java.lang.String.toUpperCase()
public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
public java.lang.String java.lang.String.trim()