Class类对象的三种实例化模式

博客介绍了Java中获取Class对象的三种方式,一是实例化对象通过Object类的getClass()方法;二是用“类.class”;三是使用Class类的forName方法。除第一种会产生类的实例化对象,其他两种不会。还指出通过反射可实例化对象,提供了新的实例化模式。

1任何的实例化对象可以通过Object类中的getClass()方法获得Class对象:

import java.util.Date;

public class Class_test1 {
	public static void main(String[] args) {
		//第一种Class实例化模式,也将是通过class类来实例化对象
		Class<?> cls = new Date().getClass();
		System.out.println(cls.getName());
	}
}

2.“类.class”,直接根据某一个具体的类来获取Class类的实例化对象。

import java.util.Date;
public class Class_test2 {
	public static void main(String[] args) {
		Class<?> cls = Date.class;//不需要实例化对象
		System.out.println(cls.getName());
	}
}

3.使用Class类提供的方法:public static Class<?> forName(String className),也就是直接使用字符串描述使用的类。(在这里不需要写import * 包了)

public class Class_test3 {
	public static void main(String[] args) throws ClassNotFoundException {
		//不需要实例化对象
		Class<?> class1 = Class.forName("java.util.Date");
		System.out.println(class1.getName());
	}
}

总结:除了第一种形式会产生类的实例化对象之外,其他两种多不会产生类的实例化对象。于是取得Class类对象有一个最直接的好处:可以直接通过反射实例化对象,在Class类里面定义如下的方法:
public T newInstance()方法
实例:

public class Class_test3 {
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		//不需要实例化对象
		Class<?> class1 = Class.forName("java.util.Date");
		//实例化对象,等价于new java.util.Date
		Object obj = class1.newInstance();
		System.out.println(obj);
	}
}

我们会发现,以前我们实例化一个对象,需要使用关键字new来实例化对象,而现在我们有第二种模式来实例化对象,就是通过反射来实例化对象

### 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值