Java SE Lesson 9
反射:第 1 步:获得Class 的对象, 要想使用反射,首先需要获得待处理类或对象所对应的Class对象。
2. 获取某个类或某个对象所对应的Class对象的常用的3种方式:
a) 使用Class类的静态方法forName:Class.forName(“java.lang.String”);
b) 使用类的.class 语法:String.class;
c) 使用对象的getClass()方法:Strings = “aa”; Class<?> clazz = s.getClass(); 这种方式必须先有对象, Object中的 getClass()并不是静态的,是 fina 不可以被重写的。
Class<?> classType = object.getClass(); // 第三种方式 生成 Class 对象
Constructor cons =classType.getConstructor(new Class[]{});
Object obj =cons.newInstance(new Object[]{});
// 以上两行代码等价于下面一行,但是 下面的一行代码只能生成构造方法不带参数的对象
// Object obj2 = classType.newInstance();
3. 若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
a) 先获得Class对象,然后通过该Class对象的newInstance()方法直接生成即可:
Class<?> classType =String.class;
Object obj = classType.newInstance();
b) 先获得Class对象,然后通过该对象获得对应的Constructor对象,再通过该Constructor
对象的newInstance()方法生成:
Class<?> classType =Customer.class;
Constructor cons =classType.getConstructor(new Class[]{});
Object obj = cons.newInstance(newObject[]{});
4. 若想通过类的带参数的构造方法生成对象,只能使用下面这一种方式:
Class<?> classType =Customer.class;
Constructor cons =classType.getConstructor(new Class[]{String.class, int.class});
Object obj = cons.newInstance(newObject[]{“hello”, 3});
5. Integer.TYPE 返回的是int,而Integer.class返回的是Integer 类所对应的Class对象(class java.lang.Integer)。
Class 中的 getFiled() 返回的是 Public 修饰的属性, getDeclaredField()返回的是所有的属性,包括Private 修饰的属性。
注意:运用 primitive wrapper classes 的TYPE 语法:
Class c1 = Boolean.TYPE; 表示的是 Boolean 的原生数据类型boolean对应的Class对象。
而要得到 Boolean 类的对应的Class 对象是 : Class c2 = Boolean.class
Java SE Lesson 10
动态代理:
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理的类以及接口
3.通过Proxy的静态方法newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h) 创建一个代理
4.通过代理调用方法
Java 注解(Annotation )
a) Override注解表示子类要重写(override)父类的对应方法。
b) Deprecated注解表示方法是不建议被使用的。
c) SuppressWarnings注解表示抑制警告。
3. 自定义注解:当注解中的属性名为value 时,在对其赋值时可以不指定属性的名称而直接写上属性值即可;除了value以外的其他值都需要使用name=value这种赋值方式,即明确指定给谁赋值。
4. 当我们使用@interface关键字定义一个注解时,该注解隐含地继承了java.lang.annotation.Annotation接口;如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的接口依然还是接口而不是注解;Annotation本身是接口而不是注解。可以与Enum类比。
所有的注解 实现接口
Override @Retention(value = SOURCE)
SuppressWarnings @Retention ( value = SOURCE)
Deprecated @Retention( value = RUNTIME)
Retention @Retention ( value =RUNTIME)
Target @Retention ( value= RUNTIME)
Documented @Retention( value = RUNTIME)
Inherited @Retention( value = RUNMITE)
java.lang.annotation
Enum RetentionPolicy
{ CLASS RUNTIME SOURCE }
7. JUnit4的执行的一般流程:
a) 首先获得待测试类所对应的Class对象。
b) 然后通过该Class对象获得当前类中所有public方法所对应的Method数组。
c) 遍历该Method数组,取得每一个Method对象
d) 调用每个Method对象的isAnnotationPresent(Test.class)方法,判断该方法是否被Test
注解所修饰。
e) 如果该方法返回true,那么调用method.invoke()方法去执行该方法,否则不执行。
8. 单元测试不是为了证明你是对的,而是证明你没有错误。
9. Writing Secure Code(编写安全的代码):Input is evil。
java.lang.reflect
Interface AnnotatedElement
All Known Implementing Classes:
AccessibleObject,Class, Constructor,Field, Method
11. Java中的异常分为两大类:
a) Checked exception (非 Runtime Exception)
b) Unchecked exception(Runtime Exception)
12. Java中所有的异常类都会直接或间接地继承自Exception。
13. RuntimeException类也是直接继承自Exception类,它叫做运行时异常,Java中所有的运行时异常都会直接或间接地继承自RuntimeException。
14. Java 中凡是继承自Exception而不是继承自RuntimeException的类都是非运行时异常。
16. 对于非运行时异常(checked exception),必须要对其进行处理(不处理就会有一个错误),处理方式有两种:第一种是使用try.. catch…finally 进行捕获,捕获后程序会继续往下执行;第二种是在调用该会产生异常的方法所在的方法声明throws Exception , 如果在 main ()中有 throws Exception 就会有虚拟机来处理,虚拟机 会暂停程序的执行。
17. 对于运行时异常(runtime exception),我们可以不对其进行处理,()也可以对其进行处理。推荐不对其进行处理。
18. NullPointerException是空指针异常,这就是个运行时异常。出现该异常的原因在于某个引用为null,但你却调用了它的某个方法。这时就会出现该异常。