反射

1.1

 

 

 

 

 

 

 

 

 

1、      获取class的三种方法

// 方式一  类.class
Class personClazz = Person.class;

// 方式二  实例.getClass()
Person person = new Person();
Class personClazz1 = person.getClass();

// 方式三  Class.forName("类的全路径")
Class personClazz2 = Class.forName("com.muse.reflect.Person");

2、      获取对象

/** 首先:获得Person的字节码 */
Class personClazz = Class.forName("com.muse.reflect.Person");

/** 其次:通过Class对象,创建构造方法对象 */
Constructor constructor1 = personClazz.getConstructor(String.class, Integer.class, Byte.class,Boolean.class); // 初始化有参构造方法对象
Constructor constructor = personClazz.getConstructor(); // 初始化无参构造方法/** 最后:通过构造方法创建对象 */
// 调用无参数构造方法创建Person对象
Person person = (Person) constructor.newInstance();
person.setName("muse1");
System.out.println("person=" + person);

// 调用有参数构造方法创建Person对象
Person person1 = (Person) constructor1.newInstance("muse1", 10, (byte) 1, true);
System.out.println("person1=" + person1);

 

3、

/**
 * public
属性的
 *
 * @throws Throwable
 */
@Test
public void test3() throws Throwable{
    // 第一步:获得Class
   
Class personClazz = Person.class;

    // 第二步:获得构造方法
   
Constructor<Person> constructor = personClazz.getConstructor();
    Person person = constructor.newInstance();

    // 第三步:通过Class对象,获得Field对象
   
Field nameField = personClazz.getField("name");
    nameField.setAccessible(true);//如果获取私有的,必须set true
/**
 * Field.toString();
 * --------------------------------------------------------------------
 * public String toString() {
 *         int mod = getModifiers();
 *         return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))
 *             + getType().getTypeName() + " "
 *             + getDeclaringClass().getTypeName() + "."
 *             + getName());
 * }
 *
 *
【Field的重要方法】
 * System.out.println("获取字段的类型:" + nameField.getType());
 * System.out.println("获取字段的名字:" + nameField.getName());
 * System.out.println("获取字段的访问修饰符:" + Modifier.toString(nameField.getModifiers()));
 * System.out.println("获取字段所在类的全路径:" + nameField.getDeclaringClass().getName());
 */

    // 第四步:操作Field,获得属性值
   
String name = String.valueOf(nameField.get(person));

    System.out.println(name);
}

3、      获取注解

如:分布式锁的实现

4、      做一个工具BeanUtils

DTO(传值)  PO(持久层)  VO(前端)  entity

DDD模型

public static void convertor(Object originObj, Object targetObj) throws Throwable{
    // 第一步,获得class对象
   
Class orginClazz = originObj.getClass();
    Class targetClazz = targetObj.getClass();

    // 第二步,获得Field
   
Field[] orginFields =  orginClazz.getDeclaredFields();
    Field[] targetFields =  targetClazz.getDeclaredFields();

    // 第三步:赋值
   
for (Field originField : orginFields) {
        for (Field targetField : targetFields) {
            if (originField.getName().equals(targetField.getName())) {
                originField.setAccessible(true);
                targetField.setAccessible(true);
                targetField.set(targetObj, originField.get(originObj));
            }
        }
    }
}

SDk

WEB  (Vo)

Application(DTO)

Domain(entity)

基础层(mysql mongDb rpc)

 

 

 

  1. 用户界面/展现层 
  负责向用户展现信息以及解释用户命令。更细的方面来讲就是: 
  a) 请求应用层以获取用户所需要展现的数据; 
  b) 发送命令给应用层要求其执行某个用户命令。
 
  2. 应用层 
  很薄的一层,定义软件要完成的所有任务。对外为展现层提供各种应用功能(包括查询或命令),对内调用领域层(领域对象或领域服务)完成各种业务逻辑,应用层不包含业务逻辑。
 
  3. 领域层 
  负责表达业务概念,业务状态信息以及业务规则,领域模型处于这一层,是业务软件的核心。
 
  4. 基础设施层 
  本层为其他层提供通用的技术能力;提供了层间的通信;为领域层实现持久化机制;总之,基础设施层可以通过架构和框架来支持其他层的技术需求。

 

posted @ 2021-02-15 09:57  majingyun  阅读(38)  评论(0编辑  收藏  举报