我看JAVA 之 Class

简介:

我看JAVA 之 Class

注:基于jdk11

Class

类 Class 的实例代表运行时java应用程序中的类和接口。枚举类型是一种类,注解类是一种接口。数组是共享同一种类的。基
本类型(boolean、byte、char、short、int、long、float和double)和关键字void也表示为类对象。
Class 没有公开的构造方法,只能由JVM创建。 当类加载器调用defineClass方法并传递类文件字节给jvm,jvm会自动构建
Class 对象。

实现了如下接口

1. java.io.Serializable
2. GenericDeclaration
  GenericDeclaration 所有声明泛型变量的实体要实现此接口(注:后续会在“我看JAVA 之 泛型“阐述)
  唯一的方法:
  public TypeVariable<?>[] getTypeParameters();//获取当前“实体”上声明的“泛型变量"。
3. Type 
  Type是java语言中所有类型的公共高级接口,它们包括原始类型、参数化类型、数组类型、泛型变量和基本类型。
  默认方法:
  default String getTypeName() {
      return toString();
  }

4. AnnotatedElement
  java.lang.reflect.AnnotatedElement 接口定义了获取在当前JVM中运行程序的注解元素。这个接口允许通过反射的方式获取注解。通过当前接口方法获取到的注解都是不可变且序列化的。

几个重点方法

  1. forName()
      public static Class<?> forName(String className)
                  throws ClassNotFoundException {
          Class<?> caller = Reflection.getCallerClass();
          return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
      }

      @CallerSensitive
      public static Class<?> forName(String name, boolean initialize,
                                     ClassLoader loader)
          throws ClassNotFoundException
      {
          Class<?> caller = null;
          SecurityManager sm = System.getSecurityManager();
          if (sm != null) {
              // Reflective call to get caller class is only needed if a security manager
              // is present.  Avoid the overhead of making this call otherwise.
              caller = Reflection.getCallerClass();
              if (loader == null) {
                  ClassLoader ccl = ClassLoader.getClassLoader(caller);
                  if (ccl != null) {
                      sm.checkPermission(
                          SecurityConstants.GET_CLASSLOADER_PERMISSION);
                  }
              }
          }
          return forName0(name, initialize, loader, caller);
      }

      /** Called after security check for system loader access checks have been made. */
      private static native Class<?> forName0(String name, boolean initialize,
                                              ClassLoader loader,
                                              Class<?> caller)
          throws ClassNotFoundException;

几个获取 Class 对象引用方式

1. Integer.class
2. new Integer(1).getClass()
3. Class.forName("java.lang.Integer")

代码示例

    package chapter03;

  import java.lang.annotation.ElementType;
  import java.lang.reflect.InvocationTargetException;

  public class TestClass {

      public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

          System.out.println("--- 3 mode get obj's Class ---");
          System.out.println(Integer.class);
          System.out.println(Integer.valueOf(1).getClass());
          System.out.println(Class.forName("java.lang.Integer"));
          System.out.println(int.class);
          System.out.println("int is privitive type or not ? " + int.class.isPrimitive());

          // array
          System.out.println("--- array' Class ---");
          System.out.println(new Integer[]{1, 3, 5}.getClass());
          System.out.println(new Object[]{1, 3, 5}.getClass());
          System.out.println(new Integer[][]{{1, 2, 3}, {2, 3, 4}, {3, 4, 5}}.getClass());

          // void package
          System.out.println("--- void & package' Class ---");
          System.out.println(Void.class);
          System.out.println(void.class);
          System.out.println(Package.class);

          // enum
          System.out.println("--- enum' Class ---");
          System.out.println(ElementType.class);
          System.out.println("ElementType is enum or not ? " + ElementType.class.isEnum());

          // annotation
          System.out.println("--- annotation' Class ---");
          System.out.println(Deprecated.class);
          System.out.println("Deprecated is interface or not ? " + Deprecated.class.isInterface());
          System.out.println("Deprecated is annotation or not ? " + Deprecated.class.isAnnotation());

          // class' Class
          System.out.println("--- class' Class ---");
          System.out.println(Class.forName("java.lang.Integer").getClass());

          // module
          System.out.println(Class.forName("chapter03.Test").getModule());

          //new instance
          System.out.println(Class.forName("chapter03.Test").getDeclaredConstructor());
          Class.forName("chapter03.Test").getDeclaredConstructor().newInstance();
          Class.forName("chapter03.Test").newInstance();

      }
  }

  class Test {
      private Test() {

      }
  }
  
  打印结果:
  
  --- 3 mode get obj's Class ---
  class java.lang.Integer
  class java.lang.Integer
  class java.lang.Integer
  int
  int is privitive type or not ? true
  --- array' Class ---
  class [Ljava.lang.Integer;
  class [Ljava.lang.Object;
  class [[Ljava.lang.Integer;
  --- void & package' Class ---
  class java.lang.Void
  void
  class java.lang.Package
  --- enum' Class ---
  class java.lang.annotation.ElementType
  ElementType is enum or not ? true
  --- annotation' Class ---
  interface java.lang.Deprecated
  Deprecated is interface or not ? true
  Deprecated is annotation or not ? true
  --- class' Class ---
  class java.lang.Class
  unnamed module @67b64c45
  private chapter03.Test()
  Exception in thread "main" java.lang.IllegalAccessException: class chapter03.TestClass cannot access a member of class chapter03.Test with modifiers "private"
      at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
      at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
      at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
      at chapter03.TestClass.main(TestClass.java:50)
相关文章
|
9天前
|
Java 编译器 Maven
Java“class file contains wrong class”解决
当Java程序运行时出现“class file contains wrong class”错误,通常是因为类文件与预期的类名不匹配。解决方法包括:1. 确保类名和文件名一致;2. 清理并重新编译项目;3. 检查包声明是否正确。
|
22天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
41 3
|
26天前
|
Java
让星星⭐月亮告诉你,Java synchronized(*.class) synchronized 方法 synchronized(this)分析
本文通过Java代码示例,介绍了`synchronized`关键字在类和实例方法上的使用。总结了三种情况:1) 类级别的锁,多个实例对象在同一时刻只能有一个获取锁;2) 实例方法级别的锁,多个实例对象可以同时执行;3) 同一实例对象的多个线程,同一时刻只能有一个线程执行同步方法。
15 1
|
2月前
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
36 3
java基础(4)public class 和class的区别及注意事项
|
26天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
35 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
2月前
|
Java
java的class类
java的class类
31 5
|
3月前
|
Java 测试技术 Docker
记录一次很坑的报错:java.lang.Exception: The class is not public.
这篇文章记录了作者在Docker中运行服务进行单元测试时遇到的一系列问题,包括Spring Boot与Spring Cloud版本不一致、Bean注入问题、测试单元引入问题以及公共类和方法的可见性问题,并提供了解决问题的方法和成功测试通过的代码示例。
记录一次很坑的报错:java.lang.Exception: The class is not public.
|
3月前
|
Java
JAVA中public class和class的区别
JAVA中public class和class的区别
45 7
|
3月前
|
Oracle Java 关系型数据库
简单记录在Linux上安装JDK环境的步骤,以及解决运行Java程序时出现Error Could not find or load main class XXX问题
本文记录了在Linux系统上安装JDK环境的步骤,并提供了解决运行Java程序时出现的"Error Could not find or load main class XXX"问题的方案,主要是通过重新配置和刷新JDK环境变量来解决。
124 0
|
4月前
|
Java
Error:Internal error: (java.lang.IllegalAccessError) class com.,idea2019.3版本,必须用application2.7.6或者以下
Error:Internal error: (java.lang.IllegalAccessError) class com.,idea2019.3版本,必须用application2.7.6或者以下