(1)反射机制 (2)常用的设计原则 (3)常用的设计模式

1.反射机制(尽量理解、难点、原理)
如:
Person p = new Person(); - 表示声明Person类型的引用指向Person类型的对象
p.show(); - 表示调用Person类中的show()方法

1.1 基本概念
通常情况下编写的代码都很固定,在运行阶段只能创建指定类型的对象以及调用指定的方法,当在编写代码时不确定要创建什么样的对象以及调用什么样的方法时,就需要采用反射机制加以处理。
所谓反射就是能在运行阶段动态地创建对象以及动态地调用方法。

1.2 Class类
(1)基本概念
java.lang.Class类由final关键字修饰表示不能被继承,该类的实例表示Java应用程序中的数据类型,如:类和接口等。
该类没有公共构造方法,该类的实例由Java虚拟机和类加载器自动构造。

(2)获取Class类对象的方式
a.使用数据类型.class的方式获取对应类型的Class对象;
b.使用对象.getClass()的方式获取对应类型的Class对象;
c.使用包装类.TYPE的方式获取对应基本数据类型的Class对象;
d.使用Class.forName()的方式获取对应类型的Class对象。

(3)常用的方法
static Class<?> forName(String className)
- 用于获取参数字符串指定类型的Class对象并返回;
T newInstance()
- 用于创建该Class对象所表示类的新实例。
- 若当前调用该方法的Class对象表示Person类,则该方法效果就是创建Person类对象
- 该方法是采用Person类中的无参方式来构造对象。

Constructor<T> getConstructor(Class<?>... parameterTypes)
- 用于获取该Class对象所表示类中参数指定的公共有参构造方法并返回。
- 若当前Class对象表示Person类,则该方法就是获取Person类的有参构造方法,而
具体哪个有参构造方法取决于该方法的实参。
Constructor<?>[] getConstructors()
- 用于获取该Class对象所表示类中所有公共构造方法并返回。

Field getDeclaredField(String name)
- 用于获取该Class对象所表示类中参数指定的成员变量并返回。
- 若当前Class对象表示Person类,则该方法可以获取Person类中的成员变量name。
Field[] getDeclaredFields()
- 用于获取该Class对象所表示类中所有成员变量并返回。

Method getMethod(String name, Class<?>... parameterTypes)
- 用于获取该Class对象所表示类中参数指定的公共成员方法并返回。
- 若当前Class对象表示Person类,则该方法可以获取Person类中成员方法getName()。
Method[] getMethods()
- 用于获取该Class对象所表示类中所有公共成员方法并返回。

1.3 Constructor类
java.lang.reflect.Constructor<T>类主要用于描述获取到的单个构造方法信息。
T newInstance(Object... initargs)
- 使用该Constructor对象所表示构造方法来构造Class对象所表示类的对象,
其中参数为调用该构造方法所需要传递的实参。
- 若该Constructor对象表示Person类中的有参构造方法,则调用该方法本质上就是
调用有参构造方法,而给该方法传递的实参本质上就是给有参构造的实参。

1.4 Field类
java.lang.reflect.Field类主要用于描述获取到的单个成员变量信息。
Object get(Object obj)
- 用于获取参数obj对象中该Field对象所表示的成员变量信息并返回。
- 若该Field对象表示Person类中的成员变量name,则调用该方法就是获取obj.name
的数值并返回。
void set(Object obj, Object value)
- 用于设置参数对象obj中该Field对象所表示的成员变量信息为参数value的数值。
- 若该Field对象表示Person类型的成员变量name,则调用该方法就是obj.name=value
void setAccessible(boolean flag)
- 当实参传递true时,则表示取消Java语言的访问检查,也就是可以访问私有成员。

1.5 Method类
java.lang.reflect.Method类用于描述获取到的单个成员方法信息。
Object invoke(Object obj, Object... args)
- 使用参数对象obj去调用该Method对象所表示的成员方法,实参传递args。
- 若该Method对象表示Person类中getName()方法,则调用该方法就是obj.getName()

1.6 JavaBean的概念(了解)
JavaBean本质上就是一种习惯性的编程规范,不是语法规定和编程规则,通常要求如下:
(1)要求满足JavaBean规范的类应该放在一个包中;
(2)要求满足JavaBean规范的类应该提供无参的构造方法;
(3)要求满足JavaBean规范的类应该私有化成员变量;
(4)要求满足JavaBean规范的类应该提供公有的get和set方法;
(5)要求满足JavaBean规范的类应该支持序列化功能;

2.常用的设计原则(理解、记住)
2.1 软件/项目开发的流程
需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级

2.2 常用的设计原则
开闭原则(OCP) - 对扩展开放,对修改关闭
如:
class Person{
private String name;
private int age;
... ...
}
class Student extends Person{
private int id;
}

里氏代换原则(LSP)- 任何父类可以出现的地方,子类一定可以出现。
- 建议多使用继承和多态的手法。
如:
public static void draw(Shape s){
s.show();
}

draw(new Rect(1, 2, 3, 4));
draw(new Cirlce(5, 6, 7));

依赖倒转原则(DIP) - 尽量依赖于抽象类和接口,而不是具体实现类。
如:
public abstract class A{
public abstract void show();
}
public class B extends A{
public void show(){}
}

接口隔离原则(ISP) - 尽量依赖于小接口,而不是大接口从而避免接口的污染。
如:
public interface FlyAnimal{
public abstract void fly();
}
public interface RunAnimal{
public abstract void run();
}

public class Dog implements RunAnimal{

public void run(){}
}

迪米特法则(最少知道原则)(DP) - 一个实体应当尽量少于其它实体之间发生关联。
- 高内聚低耦合
- 内聚就是指将一个实体应当有的功能尽量聚集在该实体的内部。
- 耦合就是指一个实体与其它实体的关联度,应该越少越好。

合成复用原则(CRP)- 应当尽量多使用合成的方式而不是继承的方式。
如:
class A{
public void show(){ ... }
}
class B{
private A a;

public B(A a){
this.a = a;
}
public void test(){
a.show();
}
}

猜你喜欢

转载自www.cnblogs.com/sumboy/p/9058618.html