Java中Class类方法使用浅析

Java中Class类方法使用浅析

1、

public String toString()

源码:isInterface() ? "interface " : (isPrimitive() ? "" : "class ")) + getName();

例如:

System.out.println(User.class.toString());
System.out.println(UserService.class.toString());
结果:
class com.timeblog.model.User
interface com.timeblog.service.UserService

2、

public String toGenericString()

例如:

System.out.println(User.class.toGenericString());
System.out.println(UserService.class.toGenericString());
System.out.println(AbstractUserService.class.toGenericString());
System.out.println(UserTypeEnum.class.toGenericString());
System.out.println(int[].class.toGenericString());
System.out.println(boolean[][].class.toGenericString());
System.out.println(String[][][].class.toGenericString());结果:
public class com.timeblog.model.User
public abstract interface com.timeblog.service.UserService
public abstract class com.timeblog.service.AbstractUserService
public final enum com.timeblog.common.UserTypeEnum
public abstract final class [I
public abstract final class [[Z
public abstract final class [[[Ljava.lang.String;主要要就把这个类的是类型的获取到 
3、

public static Class forName(String className)

例如:

Class user = Class.forName("com.timeblog.model.User");
System.out.println(user.toGenericString());
结果:
public class com.timeblog.model.User

如果参数是User的话是找不到那个类的,参数是包名+类名,返回的是一个类,默认就是初始化了的

 

4、

public static Class forName(String name, boolean initialize, ClassLoader loader)

方法返回与给定字符串名的类或接口的Class对象,使用给定的类加载器。指定的类加载器加载的类或接口。如果该参数加载器loader 为空,通过引导类加载器加载类。当类被初始化的初始化initialize参数为true,如果它没有被初始化。

例如:

ClassLoader classLoader = User.class.getClassLoader();
Class blog = Class.forName("com.timeblog.model.Blog", true, classLoader);
结果:
public class com.timeblog.model.Blog

5、

public T newInstance()

例如:

Class aClass = Class.forName("com.timeblog.model.User");
System.out.println(aClass.newInstance().toString());
结果:{} 
实例化一个对象

6、

public native boolean isInstance

这个对象能不能被转化为这个类

1、一个对象是本身类的一个对象

2、一个对象能被转化为本身类所继承类(父类的父类等)和实现的接口(接口的父接口)强转

3、所有对象都能被Object的强转

4、凡是null有关的都是false   class.inInstance(null)

类名.class和对象.getClass()几乎没有区别,因为一个类被类加载器加载后,就是唯一的一个类。

例如:

Person person = new Person();
System.out.println(Person.class.isInstance(person));
System.out.println(Human.class.isInstance(person));
System.out.println(DoThingService.class.isInstance(person));
System.out.println(Main.class.isInstance(person));
System.out.println(Object.class.isInstance(person));
System.out.println(Object.class.isInstance(null));
结果:
true
true
true
false
true
false
 

Person继承了Human,实现了DoThingService接口,Main是其他不相关类

7、

public native boolean isAssignableFrom

是从类继承的角度去判断,是判断是否为某个类的父类

例如:

System.out.println(Human.class.isAssignableFrom(Person.class));
System.out.println(DoThingService.class.isInstance(Person.class));
结果:
true
false

8、

public native boolean isInterface()

是否是接口

例如:

System.out.println(Person.class.isInterface());
System.out.println(DoThingService.class.isInterface());
结果:
false
true

9、

public native boolean isArray()

是否是数组

例如:

System.out.println(int[].class.isArray());
System.out.println(User[][].class.isArray());
结果:

true
true

10、

public native boolean isPrimitive()

主要用来判断Class是否为原始类型(boolean、char、byte、short、int、long、float、double)

例如:

System.out.println(int.class.isPrimitive());
System.out.println(Integer.class.isPrimitive());
结果:
true
false

11、

public boolean isAnnotation()

是否是注解

例如:

System.out.println(TestAnnotation.class.isAnnotation());
System.out.println(String.class.isAnnotation());
结果:
true
false
 

12、

public boolean isSynthetic()

如果该类是合成类,则返回true,否则返回false

 

13、

public String getName()

获取类名,包含包路径 , 和其他getXXXName()方法对比详见28点。

例如:

System.out.println(ArrayList.class.getName());
System.out.println(List.class.getName());结果:java.util.ArrayList
java.util.List
14、

public ClassLoader getClassLoader()

获取类装载器,默认获取的是AppClassLoader

例如:

ClassLoader classLoader = User.class.getClassLoader();
System.out.println(classLoader.getClass().getName());
结果:
sun.misc.Launcher$AppClassLoader

15、

public TypeVariable>[] getTypeParameters()

按声明顺序返回TypeVariable对象的一个数组

例如:

TypeVariable>[] typeParameters = List.class.getTypeParameters();
for (TypeVariable> typeParameter : typeParameters) {
    System.out.println(typeParameter.getName());
}
结果:
E

16、

public native Class getSuperclass()

获取父类,如果没有继承的其他父类就返回超类Object,如果是接口返回null

例如:

System.out.println(ArrayList.class.getSuperclass());
System.out.println(Person.class.getSuperclass());
System.out.println(DoThingService.class.getSuperclass());
System.out.println(Human.class.getSuperclass());
结果:
class java.util.AbstractList
class Human
null
class java.lang.Object

17、

public Type getGenericSuperclass()

获取父类但是这个包含参数类型,查看源码发现如果是接口就返回null,其他都返回getSuperclass方法的值

源码:

ClassRepository info = getGenericInfo();
if (info == null) {
    return getSuperclass();
}
if (isInterface()) {
    return null;
}
return info.getSuperclass();

例如:

System.out.println(ArrayList.class.getGenericSuperclass());
System.out.println(Person.class.getGenericSuperclass());
System.out.println(DoThingService.class.getGenericSuperclass());
System.out.println(Human.class.getGenericSuperclass());
结果:
java.util.AbstractList
class Human
null
class java.lang.Object

18、

public Package getPackage()

获取包名,java自带的会有JDK版本号等信息。

例如:

System.out.println(String.class.getPackage());
System.out.println(PackageTest.class.getPackage());
System.out.println(int.class.getPackage());

结果:
package java.lang, Java Platform API Specification, version 1.8
package com.test
null

19、

public Class[] getInterfaces() 

获取实现的接口

例如:

Class[] interfaces = ArrayList.class.getInterfaces();
for (Class anInterface : interfaces) {
    System.out.println(anInterface.getName());
}
结果:
java.util.List
java.util.RandomAccess
java.lang.Cloneable
java.io.Serializable
20、

public Type[] getGenericInterfaces()

获取实现的接口包含参数类型

例如:

Class[] interfaces = ArrayList.class.getInterfaces();
for (Class anInterface : interfaces) {
    System.out.println(anInterface.getName());
}
结果:
java.util.List
java.util.RandomAccess
java.lang.Cloneable
java.io.Serializable
 

21、

public native Class getComponentType()

获取数组的组件类型,如果该类不表示数组类此方法返回null。

例如:

System.out.println(User.class.getComponentType());
System.out.println(int[].class.getComponentType());
System.out.println(String[].class.getComponentType());
结果:
null
int
class java.lang.String

22、

public native int getModifiers();

获取Java语言修饰符这个类或接口,编码为一个整数

例如:

int modifiers = User.class.getModifiers();
System.out.println(Modifier.toString(modifiers));
int modifiers1 = int.class.getModifiers();
System.out.println(Modifier.toString(modifiers1));
结果:
public
public abstract final

23、

public native Object[] getSigners();

此方法返回这个类的签名,或者为null,如果没有签名则返回null

24、

public Method getEnclosingMethod()

返回表示底层类立即封闭方法的Method对象,如果此Class对象表示一个本地或匿名类,否则返回null。

25、

public Constructor getEnclosingConstructor() 

方法返回一个代表底层类的立即封闭构造器Constructor对象,如果此Class对象表示在构造函数本地或匿名类否则返回null

26、

public Class getDeclaringClass()

获取某个方法在那个类里面实现的

例如:

Method[] methods = Person.class.getMethods();
for (Method method : methods) {
    System.out.println(method.getName() + ":" + method.getDeclaringClass());
}
结果:
getPublicMethod:class Person
getPublicHuman:class Person
getStaticPublicMethod:class Person
getStaticPublicHuman:class Human
wait:class java.lang.Object
wait:class java.lang.Object
wait:class java.lang.Object
equals:class java.lang.Object
toString:class java.lang.Object
hashCode:class java.lang.Object
getClass:class java.lang.Object
notify:class java.lang.Object
notifyAll:class java.lang.Object

27、

public Class getEnclosingClass()

方法返回直接封闭类的底层类。如果这个类是一个顶级类此方法返回null。

例如:

public class ObjectClassMain {
    public static void main(String[] args) {
        new ObjectClassMain();
    }
    public ObjectClassMain() {
        new InnerClass().say();
    }
    class InnerClass {
        public void say() {
            System.out.println("封闭底层类:" + getClass().getEnclosingClass());
        }
    }
}
结果:
底层类:class ObjectClassMain

28、

public String getSimpleName()

获取类名,和就是getName()方法去掉包路径后的结果

例如:

System.out.println("ArrayList---->");
System.out.println(ArrayList.class.getName());
System.out.println(ArrayList.class.getSimpleName());
System.out.println(ArrayList.class.getTypeName());
System.out.println(ArrayList.class.getCanonicalName() + "\n");

System.out.println("List---->");
System.out.println(List.class.getName());
System.out.println(List.class.getSimpleName());
System.out.println(List.class.getTypeName());
System.out.println(List.class.getCanonicalName() + "\n");

System.out.println("List[]---->");
System.out.println(List[].class.getName());
System.out.println(List[].class.getSimpleName());
System.out.println(List[].class.getTypeName());
System.out.println(List[].class.getCanonicalName() + "\n");

System.out.println("int---->");
System.out.println(int.class.getName());
System.out.println(int.class.getSimpleName());
System.out.println(int.class.getTypeName());
System.out.println(int.class.getCanonicalName());
结果:
ArrayList---->
java.util.ArrayList
ArrayList
java.util.ArrayList
java.util.ArrayList

List---->
java.util.List
List
java.util.List
java.util.List

List[]---->
[Ljava.util.List;
List[]
java.util.List[]
java.util.List[]

int---->
int
int
int
int
 

29、

public String getTypeName()

获取类类型名称。对比实例详见 28点

30、

public String getCanonicalName()

方法返回底层阶级Java语言规范中定义的标准名称。如果类没有一个规范的名称,则返回null。对比实例详见 28点

31、

public boolean isAnonymousClass()

当且仅当底层类是匿名类,则返回true。

32、

public boolean isLocalClass()

当且仅当底层类是局部类,则返回true。

33、

public boolean isMemberClass()

返回true当且仅当底层类是成员类。

例如:

public class ObjectClassMain {
    public static void main(String[] args) {
        new ObjectClassMain();
    }
    public ObjectClassMain() {
        new InnerClass().say();
    }
    class InnerClass {
        public void say() {
            System.out.println("是底层成员类?:" + getClass().isMemberClass());
        }
    }
}
结果:
是底层成员类?:true

34、

public Class[] getClasses()

返回这个类的公共成员的Class对象的数组

例如:

public class ObjectClassMain {
    public static void main(String[] args) {
        Class[] classes = ObjectClassMain.class.getClasses();
        for (Class aClass : classes) {
            System.out.println(aClass.getName());
        }
    }
    private class privateClass {
    }
    public class publicClass {
    }
    public static class publicStaticClass {
    }
    protected class protectedClass {
    }
    static class staticClass {
    }
}
结果:ObjectClassMain$publicStaticClass
ObjectClassMain$publicClass
35、

public Field[] getFields() 

获得某个类的所有的公共(public)的字段,包括父类中的字段

该博文中已经写到了

36、

public Method[] getMethods()

该博文中已经写到了

37、

public Constructor[] getConstructors() 

 

该博文中已经写到了

38、

public Field getField(String name)

 

该博文中已经写到了

39、

public Method getMethod(String name, Class... parameterTypes)

 

该博文中已经写到了

40、

public Constructor getConstructor(Class... parameterTypes)

 

该博文中已经写到了

41、

public Class[] getDeclaredClasses() 

获取所有内部类

例如:

public class ObjectClassMain {
    public static void main(String[] args) {
        Class[] classes = ObjectClassMain.class.getDeclaredClasses();
        for (Class aClass : classes) {
            System.out.println(aClass.getName());
        }
    }
    private class privateClass {
    }
    public class publicClass {
    }
    public static class publicStaticClass {
    }
    protected class protectedClass {
    }
    static class staticClass {
    }
}
结果:
ObjectClassMain$staticClass
ObjectClassMain$protectedClass
ObjectClassMain$publicStaticClass
ObjectClassMain$publicClass
ObjectClassMain$privateClass

42、

public Field[] getDeclaredFields()

该博文中已经写到了

43、

public Method[] getDeclaredMethods()

该博文中已经写到了

44、

public Constructor[] getDeclaredConstructors()

该博文中已经写到了

45、

public Field getDeclaredField(String name)

该博文中已经写到了

46、

public Method getDeclaredMethod(String name, Class... parameterTypes)

该博文中已经写到了

47、

public Constructor getDeclaredConstructor(Class... parameterTypes)

该博文中已经写到了​​​​​​​

48、

public InputStream getResourceAsStream(String name)

name 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 

当资源文件和类在同一级目录时,加不加/都可以。否则必须加/

49、

public java.net.URL getResource(String name)

此方法返回一个URL对象,或者如果这个名称的资源没有找到则返回null。

50、

public java.security.ProtectionDomain getProtectionDomain() 

返回这个类的ProtectionDomain

例如:

System.out.println(ObjectClassMain.class.getProtectionDomain());
结果:ProtectionDomain  (file:/D:/ProjectWorkPlace/studyup/target/classes/ )
 sun.misc.Launcher$AppClassLoader@18b4aac2
 
 java.security.Permissions@2c7b84de (
 ("java.lang.RuntimePermission" "exitVM")
 ("java.io.FilePermission" "\D:\ProjectWorkPlace\studyup\target\classes\-" "read")
)

51、

public boolean desiredAssertionStatus()

方法返回将被分配到这个类,如果它是在调用此方法时被初始化的断言状态。

52、

public boolean isEnum()

是否是枚举

例如:

System.out.println(Person.class.isEnum());
System.out.println(TestEnum.class.isEnum());

 

结果:

false
true

53、

public T[] getEnumConstants()

获取枚举所用的枚举值

例如:

public enum TestEnum {
    TEST_A("枚举值1"),
    TEST_B("枚举值2");
    private String value;
    TestEnum(String value){
        this.value = value;
    }
    public String getValue() {
        return value;
    }
}

​​​​​​​TestEnum[] enumConstants = TestEnum.class.getEnumConstants();
for (TestEnum enumConstant : enumConstants) {
    System.out.println(enumConstant.getValue());
}
结果:
枚举值1
枚举值2

54、

public T cast(Object obj)

转成父类或者接口的实例化对象

例如:

System.out.println(Human.class.cast(new Person()));
System.out.println(DoThingService.class.cast(new Person()));
结果:
Person@76ed5528
Person@2c7b84de

55、

public Class asSubclass(Class clazz) 

转换为代表指定的类对象的子类。

源码:

if (clazz.isAssignableFrom(this))
    return (Class) this;
else
    throw new ClassCastException(this.toString());
该类是不是继承或者实现了clazz,不是会抛出异常。
例如:
System.out.println(ArrayList.class.asSubclass(List.class));
System.out.println(List.class.asSubclass(ArrayList.class));
结果:
​​​​​​​class java.util.ArrayList
Exception in thread "main" java.lang.ClassCastException: interface java.util.List
    at java.lang.Class.asSubclass(Class.java:3404)

56、

public A getAnnotation(Class annotationClass)

获取类上的指定注解

例如:

System.out.println(Person.class.getAnnotation(TestAnnotation.class);
结果:
@TestAnnotation()

57、

public boolean isAnnotationPresent(Class annotationClass)

@Retention(RetentionPolicy.RUNTIME)的时候是true
例如:
System.out.println(Person.class.isAnnotationPresent(TestAnnotation.class));
结果:
true

58、

public A[] getAnnotationsByType(Class annotationClass)

 

例如:

TestAnnotation[] annotationsByType = Person.class.getAnnotationsByType(TestAnnotation.class);
System.out.println(Arrays.toString(annotationsByType));
结果:[@TestAnnotation()]

59、

public Annotation[] getAnnotations()

获取类上的所有注解,注解上要有@Retention(RetentionPolicy.RUNTIME)

例如:

for (Annotation annotation : Person.class.getAnnotations()) {
    System.out.println(annotation);
}
结果:
@TestAnnotation()

60、

public A getDeclaredAnnotation(Class annotationClass)

返回这个元素上的annotationClass注解,若该类无直接的annotationClass注解(不包含从父类继承来的注解),则返回null

61、

public A[] getDeclaredAnnotationsByType(Class annotationClass)

根据枚举类型返回这个元素上的annotationClass注解,若该类无直接的annotationClass注解(不包含从父类继承来的注解),则返回null

62、

public Annotation[] getDeclaredAnnotations()

返回这个类上的所有直接注解(不包含从父类继承来的注解)

例如:

for (Annotation annotation : Person.class.getDeclaredAnnotations()) {

System.out.println(annotation);

}
结果:
@TestAnnotation()

63、

public AnnotatedType getAnnotatedSuperclass()

以注解的方式返回这个类继承的父类

64、

public AnnotatedType[] getAnnotatedInterfaces()

以注解的方式返回这个类实现的所有接口

 

 

                                                                      如有不对请在评论区进行评论,谢谢。

《………………………………………………菜鸟起飞中,请各位走过路过的多多指教……………………………………》

 

你可能感兴趣的:(java)