实例化Class类的5种方式

本文介绍五种在Java中获取Class对象的方法,包括使用Object.getClass()、.class语法、Class.forName()、包装类的TYPE域及特定方法。通过实例演示不同场景下如何选择合适的获取方式。

Java的数据类型可以分为两类,即引用类型和原始类型。对于每种类型的对象,Java虚拟机会实例化不可变的java.lang. Class对象。它提供了在运行时检查对象属性的方法,这些属性包括它的成员和类型信息。更重要的是Class对象是所有反射API的入口。本实例演示如何获得Class对象。实例运行效果如图



技巧:Class类是泛型类,可以使用@SuppressWarnings (“unchecked”)忽略泛型或者使用Class<?>类型。

通常有5种方式可以获得Class对象,详细说明如下。

(1)Object.getClass():如果一个类的对象可用,则最简单的获得Class的方法是使用Object.getClass()。当然,这种方式只对引用类型有用。

(2) .class语法:如果类型可用但没有对象,则可以在类型后加上“.class”来获得Class对象。这也是使原始类型获得Class对象的最简单的方式。

(3) Class.forName():如果知道类的全名,则可以使用静态方法Class.forName()来获得Class对象。它不能用在原始类型上,但是可以用在原始类型数组上。

 注意:Class.forName()会抛出ClassNotFoundException异常。

(4) 包装类的TYPE域:每个原始类型和void都有包装类。利用其TYPE域就可以获得Class对象。

(5)Class为返回值的方法:请参考反射API

编写类ClassTest,在该类的main()方法中,演示了各种获得Class对象的方法。代码如下:

package com.mingrisoft.reflection;

 

import java.util.Date;

 

public class ClassTest {

    @SuppressWarnings("unchecked")

    public static void main(String[] args) throws ClassNotFoundException {

        System.out.println("1种方法:Object.getClass()");

        Class c1 = new Date().getClass();// 使用getClass()方式获得Class对象

        System.out.println(c1.getName());// 输出对象名称

        System.out.println("2种方法:.class语法");

        Class c2 = boolean.class;// 使用.class语法获得Class对象

        System.out.println(c2.getName());// 输出对象名称

        System.out.println("3种方法:Class.forName()");

        Class c3 = Class.forName("java.lang.String");// 使用Class.forName()获得Class对象

        System.out.println(c3.getName());// 输出对象名称

        System.out.println("4种方法:包装类的TYPE");

        Class c4 = Double.TYPE;// 使用包装类获得Class对象

        System.out.println(c4.getName());// 输出对象名称

    }

}



心法领悟:掌握获得Class对象的方法。

除了java.lang.reflect.ReflectPermissionjava.lang.reflect包外,所有类都没有公共的构造方法。为了获得这些类的对象,必须使用Class类中适当的方法。对于不同的数据类型,Class对象的获得方式是不同的,读者要注意掌握。



### Python 实例化方式 #### 方法一:直接调用名并传入参数 Python 中实例化不需要使用 `new` 关键字,只需像调用函数一样使用名即可。如果构造函数(即 `__init__` 方法)需要参数,则可以在实例化时传递相应的参数。 ```python class Hello: def __init__(self, name): self.name = name def greet(self): print(f"Hello {self.name}") hello_instance = Hello("World") # 创建 Hello 的实例,并传递 "World" 参数给构造函数 hello_instance.greet() # 输出: Hello World ``` 这种方法是最常见的实例化方式[^3]。 #### 方法二:利用工厂模式创建实例 有时为了控制对象的创建过程或提供更灵活的对象初始化逻辑,可以选择实现静态方法作为工厂方法来返回新创建的对象。 ```python from datetime import date class Person: def __init__(self, name, age): self.name = name self.age = age @staticmethod def from_birth_year(name, birthYear): current_year = date.today().year return Person(name, current_year - birthYear) person_instance = Person.from_birth_year('John', 1980) # 使用静态方法创建 Person 实例 print(person_instance.age) # 基于当前年份计算年龄 ``` 这种方式允许更加复杂的实例构建逻辑而无需改变原始构造器的行为[^4]。 #### 方法三:通过元动态生成后再实例化 对于高级应用场景,可以通过自定义元来自动生成新的定义,在此基础上再进行实例化操作。这通常用于框架开发或其他需要高度抽象化的场景下。 ```python def upper_attr(class_name, class_parents, class_attrs): uppercase_attrs = { attr if callable(value) or attr.startswith('__') else attr.upper(): value for attr, value in class_attrs.items() } return type(class_name, class_parents, uppercase_attrs) class Meta(type): def __new__(cls, name, bases, dct): return super().__new__(cls, name, bases, upper_attr(name, bases, dct)) class MyKlass(metaclass=Meta): bar = 'bip' my_klass_instance = MyKlass() # 动态生成带有特定行为的新实例化 print(hasattr(my_klass_instance, 'BAR')) # True ``` 此技术主要用于解决某些特殊需求下的代码重用性和灵活性问题[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值