java new创建的是null_class.newInstance创建所有属性为null的Object

我找到了更好的解决方案

使用CDI.current()对象:class TestClass {

@Inject

ClassnameCollection collection; // Inject

void doSth(classsuffix) throws Exception {

dynamicObject = CDI.current().select(

(Class) Class.forName("org.test.Classname" + suffix)).get();

dynamicObject.doStuff();

}}

一个示例类供参考:public class ClassnameOne implements TestInterface {

@Inject

private Logger log;

// ...

@Override

public void doStuff() {

// Do stuff

log.info("done");

}}

使用此解决方案,不需要对现有类或类似的类进行任何更改。

旧版

我可能找到的最佳解决方案是这样的:

创建所有可用类的集合:public class ClassnameCollection {

@Inject

public ClassnameOne classnameOne;

@Inject

public ClassnameTwo classnameTwo;

// ...}

并将其注入您想要动态类的类中:class TestClass {

@Inject

ClassnameCollection collection; // Inject

void doSth(classsuffix) throws Exception {

Class collectionClass = ClassnameCollection.class;

Field collectionField = collectionClass.getDeclaredField("classname" + suffix); // Get the declared field by String

TestInterface dynamicObject = (TestInterface) collectionField.get(collection);

// There you have the dynamic object with all the subclasses (for example Logger) initialized

dynamicObject.doStuff();

}}

一个示例类供参考:public class ClassnameOne implements TestInterface {

@Inject

private Logger log;

// ...

@Override

public void doStuff() {

// Do stuff

log.info("done");

}}

老实说,我认为这是最好的解决方案,因为它不会改变任何子类,并且维护非常简单(只需Inject在ClassnameCollection类中添加一个新的)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
g_object_new_with_properties函数可以用于创建一个GObject实例,并且在实例化对象时可以设置该对象的属性值。它的原型如下: ```c gpointer g_object_new_with_properties (GType object_type, guint n_properties, GObjectConstructParam *properties); ``` 其中,object_type是要实例化对象的类型。n_properties是要设置的属性数量。properties是一个GObjectConstructParam类型的数组,用于保存要设置的属性信息。 下面是一个使用g_object_new_with_properties函数创建GObject实例并设置属性的示例代码: ```c #include <glib-object.h> typedef struct _MyObject MyObject; struct _MyObject { GObject parent_instance; gchar *name; gint age; }; enum { PROP_NAME = 1, PROP_AGE, N_PROPERTIES }; static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; static void my_object_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { MyObject *self = MY_OBJECT (object); switch (property_id) { case PROP_NAME: g_free (self->name); self->name = g_value_dup_string (value); break; case PROP_AGE: self->age = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void my_object_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { MyObject *self = MY_OBJECT (object); switch (property_id) { case PROP_NAME: g_value_set_string (value, self->name); break; case PROP_AGE: g_value_set_int (value, self->age); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void my_object_class_init (MyObjectClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = my_object_set_property; gobject_class->get_property = my_object_get_property; obj_properties[PROP_NAME] = g_param_spec_string ("name", "Name", "The name of the object", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); obj_properties[PROP_AGE] = g_param_spec_int ("age", "Age", "The age of the object", 0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); g_object_class_install_properties (gobject_class, N_PROPERTIES, obj_properties); } static void my_object_init (MyObject *self) { self->name = NULL; self->age = 0; } int main (void) { MyObject *obj = g_object_new_with_properties (MY_TYPE_OBJECT, 2, "name", "Tom", "age", 18); g_object_unref (obj); return 0; } ``` 在上面的示例代码中,我们定义了一个MyObject类型的GObject子类,并且添加了两个属性:name和age。在类初始化时,我们使用g_object_class_install_properties函数将这两个属性安装到MyObject类中。在对象初始化时,我们将这两个属性的默认值分别设置为NULL和0。 在main函数中,我们使用g_object_new_with_properties函数创建一个MyObject实例,并且设置name属性为"Tom",age属性为18。最后,我们使用g_object_unref函数释放该实例。 需要注意的是,在使用g_object_new_with_properties函数创建对象时,属性名称和属性值必须成对出现,并且属性名称必须是字符串类型。在示例代码中,我们使用"name"和"age"作为属性名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值