Java 基础技能

包括以下大致内容

  • Object类的常用方法
  • 常用反射方法
  • 常用字段处理
  • 枚举处理
  • 泛型的获取
  • 基本类型的判断

1. isAssignableFrom()与instanceof

  • isAssignableFrom()
    • 描述:判断目标类是否为父类的子类
    • 使用:父类.class.isAssignableFrom(子类.class)
  • instanceof
    • 描述:判断实例是否为父类的子类
    • 描述:(new)实例 instanceof 父类

具体的demo如下

 1package cn.linuxcrypt.api.demo;
 2
 3import lombok.Data;
 4import org.junit.Test;
 5
 6public class TestDemo {
 7
 8    @Test
 9    public void test(){
10        System.out.println("Parent.isAssignableFrom(Son): " + Parent.class.isAssignableFrom(Son.class));
11        System.out.println("Son.isAssignableFrom(Parent): " + Son.class.isAssignableFrom(Parent.class));
12        System.out.println("Son instanceof Parent: " + ((new Son()) instanceof Parent));
13        System.out.println("Parent instanceof Son: " + ((new Parent()) instanceof Son));
14    }
15}
16
17@Data
18class Parent{
19   private String name;
20}
21
22@Data
23class Son extends Parent{
24    private String name;
25}

输出结果

1Parent.isAssignableFrom(Son): true
2Son.isAssignableFrom(Parent): false
3Son instanceof Parent: true
4Parent instanceof Son: false

2. Class.getField和getDeclaredField的区别

  • getField和getDeclaredField都是Class类的方法,反射成员变量时使用。(getMethod和getDeclaredMethod类似)

  • getField 获取一个类的 ==public成员变量,包括基类== 。

  • getDeclaredField 获取一个类的 ==所有成员变量,不包括基类== 。

    Field.setAccessible 成员变量为private,必须进行此操作。

3. 提高java反射速度的方法method.setAccessible(true)

AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。 在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。 setAccessible  public void setAccessible(boolean flag)                     throws SecurityException  将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问,一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问,而由于反射类中的Field,Method和Constructor继承自AccessibleObject,因此,通过在这些类上调用setAccessible()方法,我们可以实现对这些字段的操作。但有的时候这将会成为一个安全隐患,为此,我们可以启用java.security.manager来判断程序是否具有调用setAccessible()的权限。默认情况下,内核API和扩展目录的代码具有该权限,而类路径或通过URLClassLoader加载的应用程序不拥有此权限。例如:当我们以这种方式来执行上述程序时将会抛出异常

  • 提高java反射速度的方法method.setAccessible(true)
  • Filed.setAccessible(true), 大多时候允许访问私有变量

参考