反射
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. 基础设施层
本层为其他层提供通用的技术能力;提供了层间的通信;为领域层实现持久化机制;总之,基础设施层可以通过架构和框架来支持其他层的技术需求。