java中class什么意思?
class是一個(gè)類,存在于java.lang包中,它的構(gòu)造函數(shù)是私有的,由JVM(類加載器)創(chuàng)建Class對象,我們可以通過getClass()方法獲取到Class對象。
/*
* 私有構(gòu)造函數(shù),使得只有jvm可以創(chuàng)建該類的對象,這個(gè)私有構(gòu)造函數(shù)還可以防止通過默認(rèn)構(gòu)造函數(shù)創(chuàng)建類對象
*/
private Class(ClassLoader loader) {
// 初始化final變量ClassLoader
classLoader = loader;
}
登錄后復(fù)制
Class 類是在Java語言中定義一個(gè)特定類的實(shí)現(xiàn)。一個(gè)類的定義包含成員變量,成員方法,還有這個(gè)類實(shí)現(xiàn)的接口,以及這個(gè)類的父類。Class類的對象用于表示當(dāng)前運(yùn)行的 Java 應(yīng)用程序中的類和接口。 比如:每個(gè)數(shù)組均屬于一個(gè) Class 類對象,所有具有相同元素類型和維數(shù)的數(shù)組共享一個(gè)Class 對象。基本的 Java 類型(boolean, byte, char, short,int, long, float 和 double) 和 void 類型也可表示為 Class 對象。
Class對象,通過它我們可以拿到創(chuàng)建的類的屬性,方法等。
Class類的作用
(1)獲取類中屬性的類型
(2)獲取類中屬性的名稱
(3)獲取類的方法
(4)獲取類的基類等等
(5)綜合上述可以利用它完成反射
Class的主要方法
1.forName方法
輸入需要加載的類的全路徑名,得到類的Class對象
2.newInstance方法
public T newInstance()
throws InstantiationException, IllegalAccessException
{
if (System.getSecurityManager() != null) {
checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false);
}
// NOTE: 下面的編碼可能不是嚴(yán)格符合當(dāng)前的java內(nèi)存模型
// 尋找構(gòu)造器
if (cachedConstructor == null) {
if (this == Class.class) {
throw new IllegalAccessException(
"Can not call newInstance() on the Class for java.lang.Class"
);
}
try {
Class<?>[] empty = {};
//獲取無參構(gòu)造器,如果沒有就拋出異常,說明這個(gè)方法只適用于有無參構(gòu)造函數(shù)的類
final Constructor<T> c = getConstructor0(empty, Member.DECLARED);
// 設(shè)置構(gòu)造器允許訪問
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<Void>() {
public Void run() {
c.setAccessible(true);
return null;
}
});
cachedConstructor = c;
} catch (NoSuchMethodException e) {
throw (InstantiationException)
new InstantiationException(getName()).initCause(e);
}
}
Constructor<T> tmpConstructor = cachedConstructor;
// 安全檢查
int modifiers = tmpConstructor.getModifiers();
if (!Reflection.quickCheckMemberAccess(this, modifiers)) {
Class<?> caller = Reflection.getCallerClass();
if (newInstanceCallerCache != caller) {
Reflection.ensureMemberAccess(caller, this, null, modifiers);
newInstanceCallerCache = caller;
}
}
// 執(zhí)行無參構(gòu)造函數(shù)創(chuàng)建實(shí)例對象
try {
return tmpConstructor.newInstance((Object[])null);
} catch (InvocationTargetException e) {
Unsafe.getUnsafe().throwException(e.getTargetException());
// Not reached
return null;
}
}
登錄后復(fù)制
3.isInstance(native方法)
用于判斷入?yún)⑹欠駷楫?dāng)前Class對象(子類)的實(shí)現(xiàn)類
public class TestInfo {
static {
System.out.println("我是誰");
}
public TestInfo(){
System.out.println("我是構(gòu)造函數(shù)");
}
public String test="測試屬性";
public static void main(String[] args) {
TestClass info=new TestClass();
//返回結(jié)果是true因?yàn)閕nfo是子類的對象System.out.println(TestInfo.class.isInstance(info));
}
public static class TestClass extends TestInfo{
}}
登錄后復(fù)制
4.getName、getTypeName、getCanonicalName、getSimpleName
public static void main(String[] args) {
System.out.println(TestClass.class.getTypeName());
System.out.println(TestClass.class.getCanonicalName());
System.out.println(TestClass.class.getSimpleName());
System.out.println(TestClass.class.getName());
System.out.println("-------------------------------------------------------");
System.out.println(TestClass[].class.getTypeName());
System.out.println(TestClass[].class.getCanonicalName());
System.out.println(TestClass[].class.getSimpleName());
System.out.println(TestClass[].class.getName());
}
public static abstract class TestClass<T extends TestInfo, String> extends TestInfo implements Aware, Comparable<Integer> {
public abstract void test();
}
登錄后復(fù)制
輸出結(jié)果
com.hikvision.test.abc.TestInfo$TestClass com.hikvision.test.abc.TestInfo.TestClass TestClass com.hikvision.test.abc.TestInfo$TestClass ------------------------------------------------------- com.hikvision.test.abc.TestInfo$TestClass[] com.hikvision.test.abc.TestInfo.TestClass[] TestClass[] [Lcom.hikvision.test.abc.TestInfo$TestClass;
登錄后復(fù)制
5.getClassLoader
獲取當(dāng)前類的類加載器
6.getTypeParameters
獲取泛型類中的泛型參數(shù)數(shù)組。
7.getSuperclass和getGenericSuperclass
都是獲取父類信息,但是后者會帶上泛型參數(shù)
8.getInterfaces和getGenericInterfaces
獲取當(dāng)前Class對象實(shí)現(xiàn)的接口數(shù)組,但是后者會帶上接口的泛型參數(shù),如
public static void main(String[] args) {
System.out.println(TestClass.class.getInterfaces()[1]);
}
public static abstract class TestClass<T extends TestInfo,String> extends TestInfo implements Aware,BeanFactory {
public abstract void test();
}
登錄后復(fù)制
輸出結(jié)果
interface org.springframework.beans.factory.BeanFactory java.lang.Comparable<java.lang.Integer>
登錄后復(fù)制
9.isAssignableFrom(native方法)
這個(gè)方法比較反人類,括號里的入?yún)⒈硎镜氖钱?dāng)前Class對象的父類或者是同一個(gè)對象時(shí)才成立。
//這樣返回的是false System.out.println(TestClass.class.isAssignableFrom(TestInfo.class));
登錄后復(fù)制
10.isInterface(native方法)
判斷是否為接口
11.isArray(native方法)
是否為數(shù)組
12.isPrimitive(native方法)
用于判斷這個(gè)Class對象是否為基本類型,如int,byte,char等
13.isAnnotation
判斷這個(gè)Class對象是否為注解
14.getComponentType
如果當(dāng)前Class對象是數(shù)組,獲取數(shù)組中的元素類型
15.getModifiers
獲取屬性或方法前面的修飾詞對應(yīng)的枚舉值
16.getDeclaringClass
獲取方法或?qū)傩缘臍w屬類,或者獲取當(dāng)前Class對象繼承于哪個(gè)類
17.getSimpleName
Class對象的類名
18.getClasses、getDeclaredClasses
(1)獲取Class對象中public修飾的內(nèi)部類
(2)獲取Class對象中的內(nèi)部類,繼承成員是不包含在內(nèi)的
19.getFields、getField、getDeclaredFields
(1)獲取public修飾的屬性域
(2)根據(jù)輸入的屬性名查找對應(yīng)的屬性域
(3)獲取Class對象中的屬性域
20.getMethods、getMethod、getDeclaredMethods
(1)獲取public修飾的方法
(2)根據(jù)輸入的方法名和入?yún)㈩愋停檎覍?yīng)的方法
(3)獲取Class對象中的方法
21.getConstructors、getConstructor、getDeclaredConstructors
(1)獲取public修飾的構(gòu)造函數(shù)
(2)根據(jù)輸入的方法名和入?yún)㈩愋停檎覍?yīng)的構(gòu)造函數(shù)
(3)獲取Class對象中的構(gòu)造函數(shù)
以上就是java中class什么意思?的詳細(xì)內(nèi)容,更多請關(guān)注風(fēng)君子博客其它相關(guān)文章!
總結(jié)
以上是生活随笔為你收集整理的java中class什么意思?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python星空画法教程_对比几段代码,
- 下一篇: 微软 Win11/10 WSL 支持 D