Java中class对象的学习

BingBing-8888 / 2024-10-12 / 原文

Class对象


目录
  • Class对象
    • 获取class对象的三种方法
    • 获取类的各种信息
      • 获取类名
      • 获取类修饰符
      • 获取包的信息
      • 获取父类的class对象
      • 获取接口信息
      • 构造函数Constructor
    • 两种创建对象的方式
      • 使用Class.forName()加载类并创建对象
      • 使用Class.forName()加载类,并调用特定的构造器

获取class对象的三种方法

Class对象包括一个类的方法、变量、接口、类名、类修饰符等等信息,获取Class对象有三种方法。

  1. 对象.getClass方法
  2. 类名.class属性
  3. Class的forName方法,参数为类的全路径
		//获取Class对象的三种方法
        Test test = new Test();
        Class c1 = test.getClass();
        Class c2=Test.class;
        Class c3=Class.forName("ClassTest.Test");

获取类的各种信息

获取类名

 //获取类名
    String name=c1.getName();
    String simplename=c1.getSimpleName();
    System.out.println("类名(带包名称):"+name);
    System.out.println("类名(不带包名称):"+simplename);

获取类修饰符

  //获取类修饰符
    int modifierid=c1.getModifiers();
    //通过返回int值判断是否是某一修饰符
    boolean isPublic=Modifier.isPublic(modifierid);
    boolean isPrivate=Modifier.isPrivate(modifierid);
    boolean isAbstract=Modifier.isAbstract(modifierid);
    boolean isFinal=Modifier.isFinal(modifierid);
    boolean isInterface=Modifier.isInterface(modifierid);

    System.out.println(modifierid+"是否public:"+isPublic);
    System.out.println(modifierid+"是否Private:"+isPrivate);
    System.out.println(modifierid+"是否Abstract:"+isAbstract);
    System.out.println(modifierid+"是否Final:"+isFinal);
    System.out.println(modifierid+"是否Interface:"+isInterface);

获取包的信息

	//获取包信息
    Package pack=c1.getPackage();
    System.out.println("包信息:"+pack.getName());

获取父类的class对象

	//获取父类的Class对象
	Class parentclass=c1.getSuperclass();
	System.out.println("父类对象:"+parentclass.getName());

获取接口信息

	//获取接口信息
    Class [] interfacename=c1.getInterfaces();
    for (Class c:interfacename)
            System.out.println("实现接口:"+c.getName());

构造函数Constructor

		//获取构造函数Constructor
        Constructor [] constructors=c1.getConstructors();
        for (Constructor constructor:constructors){
            System.out.print("构造方法名称:"+constructor.getName());
            Class[] parameterTypes = constructor.getParameterTypes();
            for (Class parameterType:parameterTypes){
                System.out.print("\t构造方法参数:"+parameterType.getName());
            }
            System.out.println();
        }

两种创建对象的方式

使用Class.forName()加载类并创建对象

首先,你需要使用Class.forName()方法加载类的Class对象,然后可以使用这个Class对象的newInstance()方法(注意:在Java 9及更高版本中,newInstance()方法已被标记为过时,推荐使用getDeclaredConstructor()方法)来创建类的实例。

try {  
    // 加载类并创建其实例  
    Class<?> clazz = Class.forName("com.example.MyClass");  
    Object instance = clazz.getDeclaredConstructor().newInstance(); // Java 9之前  
      
    // Java 9及更高版本推荐使用的方式  
    // Constructor<?> constructor = clazz.getDeclaredConstructor();  
    // constructor.setAccessible(true); // 如果构造器是私有的,则需要设置可访问性  
    // Object instance = constructor.newInstance();  
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {  
    e.printStackTrace();  
}

使用Class.forName()加载类,并调用特定的构造器

如果你需要调用类的特定构造器(比如带有参数的构造器),你可以使用getDeclaredConstructor(Class<?>... parameterTypes)方法来获取该构造器的Constructor对象,然后调用newInstance(Object... initargs)方法创建对象。

try {  
    Class<?> clazz = Class.forName("com.example.MyClass");  
    // 假设MyClass有一个接受String参数的构造器  
    Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);  
    Object instance = constructor.newInstance("Hello, World!");  
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {  
    e.printStackTrace();  
}