根据Type获取类名映射对象,并根据构造方法赋值

该代码段展示了如何使用Java的反射机制根据传入的类型信息动态地通过构造函数创建对象。首先,它根据类型名称创建类对象,然后获取匹配的构造函数,并使用给定的参数实例化对象。此方法常用于框架或库中,以提供灵活的对象创建能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public <T extends Object> T errorReturn(Integer code, String message, Type type){
        Class<?>[] classTypes = new Class[]{int.class, String.class};
        Object[] params = new Object[]{code, message};
        Class clazz = null;
        Constructor<T> con = null;
        T t = null;
        try {
            String a = type.getTypeName();
            if (a.contains("<")){
                clazz = Class.forName(a.substring(0, a.indexOf("<")));
            }else {
                clazz = Class.forName(a);
            }
            con = clazz.getConstructor(classTypes);
            t = (T)con.newInstance(params);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }catch (NoSuchMethodException e) {
            e.printStackTrace();
        }catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return t;
    }
### C# 中替换类名赋值方法 在C#中,如果目标是对某个特定类型的对象执行自定义的赋值逻辑,则可以通过重载操作符或实现接口来达到目的。然而,“替换类名”的概念不适用于此场景;更确切地说,应当关注于如何改变实例化方式或是修改已有对象的状态。 对于想要更改现有对象属性的方式,可以考虑如下几种方案: #### 使用构造函数初始化新对象复制所需属性 这种方法涉及创建一个新的类实例将旧对象的相关成员传递给它。这不仅限于简单类型转换,也适合复杂的数据结构处理。 ```csharp public class OriginalClass { public int Id { get; set; } public string Name { get; set; } // 构造函数用于接收另一个相同类型的对象拷贝其公共属性 public OriginalClass(OriginalClass other) { this.Id = other.Id; this.Name = other.Name; } } ``` #### 实现 ICloneable 接口以提供深浅克隆功能 ICloneable 是 .NET Framework 提供的一个标准接口,允许开发者定义自己的克隆行为。需要注意的是,由于该接口返回 object 类型的结果,因此建议显式指定具体类型的方法签名。 ```csharp using System; public class ClonableObject : ICloneable { private readonly List<int> _items; public ClonableObject() => _items = new(); protected virtual void CopyTo(ClonableObject target) { foreach (var item in _items) target._items.Add(item); } public object Clone() { var clone = MemberwiseClone(); ((ClonableObject)clone).CopyTo((ClonableObject)clone); return clone; } } // 显式的强类型版本 public static T DeepClone<T>(this T obj) where T : ClonableObject, new() { using(var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); ms.Position = 0; return (T)formatter.Deserialize(ms); } } ``` #### 利用表达式树动态构建赋值语句 当面对大量相似但又有所区别的实体映射需求时,利用 Expression Trees 可以为不同源和目标之间的字段匹配生成高效的 IL 代码片段。这种方式特别适用于ORM框架内部机制的设计。 ```csharp using System.Linq.Expressions; static Action<TSource, TDestination> CreateAssignmentExpression<TSource, TDestination>() { ParameterExpression sourceParam = Expression.Parameter(typeof(TSource), "source"); ParameterExpression destParam = Expression.Parameter(typeof(TDestination), "dest"); var bindings = typeof(TDestination).GetProperties(BindingFlags.Instance | BindingFlags.Public) .Select(p => p.Name) .Where(propName => typeof(TSource).GetProperty(propName) != null); BlockExpression blockExpr = Expression.Block( bindings.Select(name => Expression.Assign(Expression.Property(destParam, name), Expression.Property(sourceParam, name))) ); LambdaExpression lambda = Expression.Lambda<Action<TSource, TDestination>>(blockExpr, sourceParam, destParam); return (Action<TSource, TDestination>)lambda.Compile(); } ``` 上述三种策略均能有效地解决不同类型下的“赋值”问题,而无需真正意义上地去“替换”任何类的名字。每种解决方案都有各自的适用范围以及优缺点,在实际项目开发过程中可根据具体情况灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da297368860

你的鼓励是优质内容产出的最大动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值